前言
本文没有什么技术含量,就是自己的代码审计学习笔记
准备
代码下载链接:
php版本不能太高,这里用的是php5.4.45,xdm可以直接下载,使用的时候注意修改一下配置文件中的dll
文件路径,另外下面两个扩展要打开
- extension=php_gd2.dll
- extension=php_mysql.dll
mysql自不用多说,肯定也是要有的
进入piwigo目录,启动web应用:
php5.4.45 -S 10.0.2.15:12345
分析代码
这个注入漏洞的成因就是in_array
的强制类型转换
第一个参数会被强制转换为符合第二个参数(数组)中元素类型的数据类型
具体位置在piwigo-2.7.1\piwigo\include\functions_rate.inc.php
的42行
方法rate_picture
是在piwigo-2.7.1\piwigo\picture.php
的第344行调用的
向上回溯并进行调试,可以发现要想触发漏洞,需要两个前置条件(通过调试picture.php中的代码可以得出):
- 要有用户权限
- 至少要上传一张照片到相册中
然后在用户界面中一顿捣鼓(其实也没几个可以点的地方),发现下面这个地方会提交请求到piwigo-2.7.1\piwigo\picture.php
就是这个幻灯片放映这里,通过复制链接地址即可获得需要的参数:
picture.php?/1/category/1&slideshow=
通过调试代码我们可以知道还需要一个get参数action
,且值为rate
,另外还需要一个post参数rate
,这个参数的值就是用于构造SQLI载荷的参数:
可以看到我们的'
顺利进入了sql语句(虽然被转义了)
也就是说只要前面的是数字,整个变量就会被转换成后面数组元素的类型(本案例为int)
也就是12412a98r90qw8riere
会被转换成12412
而且这种转换是默认的,只有你给in_array
的第三个参数设置为true时,才不会进行这种强制类型转换
最后我们再给http头加上cookie,保存成文件给sqlmap跑时间盲注就行了
POST /picture.php?/1/category/1=&slideshow=&action=rate HTTP/1.1
Host: 10.0.2.15:2345
Cookie: pwg_id=kerp8jdk2pr0vbcqp1bet4ap34
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
rate=1
sqlmap -r 1.txt -p rate -v 3 --tech=T