滲透學習筆記之php+ mysql注入(二)


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 = addslashes($_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) => &amp;
” (雙引號) => &quot; (當ENT_NOQUOTES沒有設置的時候)
‘ (單引號) => &#039; (當ENT_QUOTES設置)
< (小於號) => &lt;
> (大於號) => &gt;   

htmlspecialchars可以用來過濾GET

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里的參數

 


免責聲明!

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



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