1如果權限為root或者比較大的權限,可以嘗試跨褲注入,一般適用在站群
2php繞過安全機制
php安全函數 1 有哪些 2 作用 3 注入時的特征 4 可不可以繞過
1. addslashes
addslashes 返回字符串,該字符串為了數據庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字符)。
一個使用 addslashes() 的例子是當你要往數據庫中輸入數據時。 例如,將名字 O'reilly 插入到數據庫中,這就需要對其進行轉義。 強烈建議使用 DBMS 指定的轉義函數 (比如 MySQL 是 mysqli_real_escape_string(),PostgreSQL 是 pg_escape_string()),但是如果你使用的 DBMS 沒有一個轉義函數,並且使用 \ 來轉義特殊字符,你可以使用這個函數。 僅僅是為了獲取插入數據庫的數據,額外的 \ 並不會插入。 當 PHP 指令 magic_quotes_sybase 被設置成 on 時,意味着插入 ' 時將使用 ' 進行轉義。
PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默認是 on, 實際上所有的 GET、POST 和 COOKIE 數據都用被 addslashes() 了。 不要對已經被 magic_quotes_gpc 轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。 遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。
stripslashes為addslashes的unescape函數
<?php
$str = $_GET["id"]);
$conn=@mysql_connect("localhost",'root','');
mysql_select_db("injection",$conn);
$sql="select * from mysql where sqlin='$str' ";
$query=mysql_query($sql);
$arr=mysql_fetch_array($query)
echo &arr;
?>
|
類似這樣的函數繞過就是用寬字節繞過
可以這樣構造payload:id=1%BF%27 and sleep(3) --+
則最終的sql語句:SELECT * FROM mysql WHERE sqlin='1�\' and sleep(3) -- ' LIMIT 0,1
2. htmlspecialchars
htmlspecialchars把HTML中的幾個特殊字符轉義成HTML Entity(格式:&xxxx;)形式,包括(&),('),("),(<),(>)五個字符。
& (AND) => &
” (雙引號) => " (當ENT_NOQUOTES沒有設置的時候)
‘ (單引號) => ' (當ENT_QUOTES設置)
< (小於號) => <
> (大於號) => >
htmlspecialchars可以用來過濾GE
POST,$COOKIE數據,預防XSS。注意htmlspecialchars函數只是把認為有安全隱患的HTML字符進行轉義,如果想要把HTML所有可以轉義的字符都進行轉義的話請使用htmlentities。
htmlspecialchars_decode為htmlspecialchars的decode函數。
HTML實體對照表:http://www.w3school.com.cn/html/html_entities.asp
<?php
echo htmlspecialchars($string);
echo htmlentities($string);
?>
|
3. htmlentities
htmlentities把HTML中可以轉義的內容轉義成HTML Entity。html_entity_decode為htmlentities的decode函數。
4. mysql_real_escape_string
mysql_real_escape_string會 調用MySQL的庫函數mysql_real_escape_string,對(\x00), (\n), (\r), (\), (‘), (\x1a)進行轉義,即在前面添加反斜杠(),預防SQL注入。注意你不需要在讀取數據庫數據的時候調用stripslashes來進行 unescape,因為這些反斜杠是在數據庫執行SQL的時候添加的,當把數據寫入到數據庫的時候反斜杠會被移除,所以寫入到數據庫的內容就是原始數據, 並不會在前面多了反斜杠
但是現在已經不推薦使用mysql_real_escape_string()了,所有新的應用應該使用像PDO一樣的函數庫執行數據庫操作
5. strip_tags
strip_tags會過濾掉NUL,HTML和PHP的標簽,JavaScript,當然你也可以通過設置該函數的第二個參數,讓一些特定的標簽出現
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";
// 允許 <p> 和 <a>
echo strip_tags($text, '<p><a>');
?>
|
輸出結果
Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>
|
6、safe_mode
Removed from PHP, and generates a fatal E_CORE_ERROR level error when enabled.
可以通過配置php.ini中的disable_functions函數列表進行限制指定函數
7、magic_quotes_gpc
此函數在PHP <= 4.2.3默認開,會自動對GPC (Get/Post/Cookie)提交的值中的’, “, 和空格進行轉義,PHP5.4中get_magic_quotes_gpc()默認返回false。
基本上還是不受影響,先檢測狀態,然后采用mysql_real_escape_string進行轉義處理
一樣可以用寬字節注入
8、register_globals
描述:此函數雖然從PHP>>4.2開始默認由on改為off,但是如果程序員開啟的話會導致變量覆蓋等安全問題,特別是結合文件包含漏洞等。
可以結合前面sablog源碼中的函數進行改寫(采用extract函數).
9、session_register
已刪除(session_unregister()、session_is_registered 刪除),采用session認證的時候可以用該函數注冊session變量。
采用$_SESSION數組進行注冊變量。
10、is_numeric()和intval()
判斷數據是否為數字型,是就返回true,不是就返回false
可以用編碼繞過
11、自己編寫的過濾函數
一般用正則過濾
繞過可以用大小寫繞過,編碼繞過
以上繞過都可以嘗試不同提交方式繞過,因為可能程序員疏忽,導致一些提交方式沒做過濾,比如,進行cookie注入
手工注入注意閉合單引號’#注釋
分析注入時注意抓包分析
看有沒有數據傳輸有就可以測試注入
cookie 注入就把參數放到cookie里進行測試或者測試cookie里的參數
