• 最新时间注入攻击和代码分析技术


    点击星标,即时接收最新推文

    e1b83ddb3c40ebef197d180668eedd20.png

    本文选自《web安全攻防渗透测试实战指南(第2版)》

    点击图片五折购书

    af8ba6450e725fb6d9e36d4c31ec990b.gif

    时间注入攻击

    时间注入攻击的测试地址在本书第2章。

    访问该网址时,页面返回yes;在网址的后面加上一个单引号,即可再次访问,最后页面返回no。这个结果与Boolean注入非常相似,本节将介绍遇到这种情况时的另外一种注入方法——时间注入。它与Boolean注入的不同之处在于,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间变长。时间注入多与if(expr1,expr2,expr3)结合使用,此if语句的含义是,如果expr1是TRUE,则if()的返回值为expr2;反之,返回值为expr3。所以判断数据库库名长度的语句应如下:

    if (length(database())>1,sleep(5),1)

    上面这行语句的意思是,如果数据库库名的长度大于1,则MySQL查询休眠5秒,否则查询1。

    而查询1需要的时间,大约只有几十毫秒。可以根据Burp Suite中页面的响应时间,判断条件是否正确,结果如图4-40所示。

    0ef0656ab6a73e2acf9725974345eaf6.jpeg

    图4-40  

    可以看出,页面的响应时间是5005毫秒,也就是5.005秒,表明页面成功执行了sleep(5),所以长度是大于1的。尝试将判断数据库库名长度语句中的长度改为10,结果如图4-41所示。

    4977a96c5ed5b374b83667828a9a5ab8.jpeg

    图4-41  

    可以看出,执行的时间是0.002秒,表明页面没有执行sleep(5),而是执行了select 1,所以数据库的库名长度大于10是错误的。通过多次测试,就可以得到数据库库名的长度。得出数据库库名的长度后,查询数据库库名的第一位字母。查询语句跟Boolean注入的类似,使用substr函数,修改后的语句如下:

    if(substr(database(),1,1)='t',sleep(5),1)

    结果如图4-42所示。

    8f581784aeacb37d83f122cb68533b4a.jpeg

    图4-42  

    可以看出,程序延迟了5秒才返回,说明数据库库名的第一位字母是t。依此类推,即可得出完整的数据库的库名、表名、字段名和具体数据。

    56e050b1e09ab5f82dbe820412abc213.gif

    时间注入代码分析

    在时间注入页面,程序获取GET参数ID,通过preg_match判断参数ID中是否存在Union危险字符,然后将参数ID拼接到SQL语句中。从数据库中查询SQL语句,如果有结果,则返回yes,否则返回no。当访问该页面时,代码根据数据库查询结果返回yes或no,而不返回数据库中的任何数据,所以页面上只会显示yes或no。和Boolean注入不同的是,此处没有过滤sleep等字符,代码如下:

    1. $con=mysqli_connect("localhost","root","123456","test");
    2. if (mysqli_connect_errno())
    3. {
    4. echo "连接失败: " . mysqli_connect_error();
    5. }
    6. $id = $_GET['id'];
    7. if (preg_match("/union/i", $id)) {
    8. exit("no");
    9. }
    10. $result = mysqli_query($con,"select * from users where `id`='".$id."'");
    11. $row = mysqli_fetch_array($result);
    12. if ($row) {
    13. exit("yes");
    14. }else{
    15. exit("no");
    16. }
    17. ?>

    此处仍然可以用Boolean注入或其他注入方法,下面用时间注入演示。当访问id=1' and if(ord(substring(user(),1,1))=114,sleep(3),1)%23时,执行的SQL语句如下:

    select * from users where `id`='1' and if(ord(substring(user(),1,1))=114,sleep (3),1)%23

    由于user()为root,root第一个字符'r'的ASCII值是114,所以SQL语句中if条件成立,执行sleep(3),页面会延迟3秒,通过这种延迟即可判断SQL语句的执行结果。

    064b534dd75c232147b46e1540692fef.gif

    MS08067安全实验室视频号已上线

    欢迎各位同学关注转发~

    —  实验室旗下直播培训课程  —

    a7ee2fc8ce4ae8cbaa2dfba2648b26dc.png

    5acd5b0a5ad8b3e2a54011788af95fff.jpeg

    a1dc141525ffdf3ada66148b5b8d26e8.jpeged5f02563f3337d95eb30a382edce473.png

    afe445a591681021b8c5d8caa936bad1.jpeg

    afaffb4d15eab454ad948b1b5191a73b.jpeg

    ef4ab8d0ce966b022e557d57a6641a4f.jpeg

    89a2490f3526354e77a27253755a6e9b.jpeg

    8e8540f297e0fbaa3e3ceba62c51886a.jpeg


    和20000+位同学加入MS08067一起学习

    2e413dd716d581dc1e0d375cf5582648.gif

  • 相关阅读:
    【git】关于Git这一篇就够了
    leetcode:1201. 丑数 III【二分 + 数学 + 容斥原理】
    同事提出个我从未想过的问题,为什么Kubernetes要"多此一举"推出静态Pod概念?
    电脑重装系统后Win11安全中心无法打开如何解决
    [答疑]微信餐馆案例中,“启动二维码对应的程序”这个用例合理吗
    网络原理之 TCP解释超详细!!!
    mkv视频文件损坏如何修复?很简单方法
    QT QInputDialog弹出消息框用法
    集合Set
    注解在Java中有什么用?请给出示例
  • 原文地址:https://blog.csdn.net/shuteer_xu/article/details/133191482