将源码放到phpstudy的www目录下开启apache和mysql服务后访问,操作和搭建文件上传漏洞靶场类似

源码:https://github.com/xiubaodejiqiu/firstout/blob/main/sqqyw.zip

解压后访问http://localhost/sqqyw进入配置模式,此时需要提前在phpstudy创建一个数据库,内容自定义,根据页面对应内容输入刚刚添加的数据库,管理员用户账号密码自定义。如果遇到报错修改/sqqyw/php/ino.php,此文件就是刚刚访问的页面,找到对应的第十六条sql语句上的第十五条最后一个字段注释掉,是因为上一句sql中多写入了一个字段,但是下一句sql没有这个字段导致的报错。

接着进入登陆界面

输入信息点击提交订单后,会执行sql语句查询,打开seay代码审计对mysql监控,找到执行的sql语句,定位到function.php中的ywdd函数。但是我这里并没有执行成功,搜索资料了解到可能是mysql版本问题导致的,这也是其中的一个打开思路,因为我们看到的页面是index.php,可以在index.php中找到具体调用了哪些函数,哪些函数里面调用了sql语句,思路打开

mysql_fetch_array — 从结果集中取得一行作为关联数组

mysql_query — 发送一条 MySQL 查询

此sql语句只有一个$ip是变量,$ip是函数传参过来的,看看那个地方调用了这个函数

是index.php中调用了该函数,参数值是通过getIP()函数获取的,于是追踪getIP()函数。

我们需要找到声明getIP()函数的位置,如图知道v144.php里都是调用函数,我们是从index.php来的,他的声明也在function.php中。

isset — 检测变量是否已声明并且其值不为空

getenv — 获取单个或者全部环境变量

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建

代码先声明一个静态变量$realip,判断$_SERVER是不是空,$_SERVER可以理解为请求request的内容,存在请求进入下一步,检测请求内容里面有没有X-FORWARDED-FOR内容,如果有,真正的ip就是X-FORWARDED-FOR,存在client-ip的话,IP就是client-ip,不然就等于remote-addr。如果没有请求就根据自己声明的环境变量对ip赋值

我们访问的是index.php页面,调用了ywdd函数,ywdd函数调用了getIP()函数,所以我们在request请求中添加xff或者其他两个,指定访问的ip,做到可控。观察sql语句,需要用到’闭合,于是我们构建数据包

unionselect到5的时候爆出字段

在function.php中还发现了可以自定义值的函数

全局搜索到v144.php调用,访问页面

in_array — 检查数组中是否存在某个值

array — 新建一个数组

找到这个字来源,是因为domain的内容不在sohuquan内导致的显示,domain追溯来到$url,是request的referer字段,属于可控。也就是说,是因为host值和referer值不一样导致返回“从哪儿来回哪儿去”

然后重新构造数据包添加referer

这句话有个警告,它请求的是其他网站页面内容,不相关不看他

然后是“请输入完整”,get请求的参数为空会输出该语句,我们再添加参数值

然后提示验证码有误

根据}闭合情况观察到判断完isset为真后verify为假于是验证码错误

接着发现代码内容部分雷同,以$connects分隔开,上部分代码出现api参数,且上部分代码没有“验证码错误”语句,个人猜测是以不同方式请求的页面得到的内容不同

将yz替换为api重新发送,因为回显response没有mess购买失败

不能确定如何影响到回显值,但是我们需要的目的已经达到了,只需要以下内容被执行即可,不用考虑购买成功与否

结合目前收集到的信息,我们在request请求包中添加id参数,ywID函数会调用id到sql语句执行

打开sqlmap,确实能跑出来俩数据库