返回
顶部

前言

本文没有什么技术含量,就是自己的代码审计学习笔记

准备

代码下载链接:

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行

image-20210622074133636

方法rate_picture是在piwigo-2.7.1\piwigo\picture.php的第344行调用的

向上回溯并进行调试,可以发现要想触发漏洞,需要两个前置条件(通过调试picture.php中的代码可以得出):

  • 要有用户权限
  • 至少要上传一张照片到相册中

然后在用户界面中一顿捣鼓(其实也没几个可以点的地方),发现下面这个地方会提交请求到piwigo-2.7.1\piwigo\picture.php

image-20210622075048599

就是这个幻灯片放映这里,通过复制链接地址即可获得需要的参数:

picture.php?/1/category/1&slideshow=

通过调试代码我们可以知道还需要一个get参数action,且值为rate,另外还需要一个post参数rate,这个参数的值就是用于构造SQLI载荷的参数:

image-20210622075632417

可以看到我们的'顺利进入了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

image-20210622082738764