电竞比分网-中国电竞赛事及体育赛事平台

分享

代碼審計(jì)入門總結(jié)

 victor1208 2016-02-15

from:http://drops./tips/12751

0x01 整體


學(xué)習(xí)代碼審計(jì)的目標(biāo)是能夠獨(dú)立完成對(duì)一個(gè)CMS的代碼安全監(jiān)測(cè)。其通用的思路有:

  • 通讀全文代碼,從功能函數(shù)代碼開始閱讀,例如include文件夾下的common_fun.php,或者有類似關(guān)鍵字的文件。

  • 看配置文件,帶有config關(guān)鍵字的文件,找到mysql.class.php文件的connect()函數(shù),查看在數(shù)據(jù)庫(kù)連接時(shí)是否出現(xiàn)漏洞。

  • 繼續(xù)跟讀首頁(yè)文件,index.php,了解程序運(yùn)作時(shí)調(diào)用了哪些函數(shù)和文件 以index.php文件作為標(biāo)線,一層一層去擴(kuò)展閱讀所包含的文件,了解其功能,之后進(jìn)入其功能文件夾的首頁(yè)文件,進(jìn)行擴(kuò)展閱讀。

0x02 各種洞洞


a.文件操作漏洞

  • 能不用文件名參數(shù)就不用 盡量不要讓用戶可控

  • 平行用戶的權(quán)限 管理員的權(quán)限 操作權(quán)限

  • 禁止傳入?yún)?shù)類似于這種 .. ,/,\ 檢查傳入的參數(shù),做出限制,停止程序往下執(zhí)行

1.文件包含漏洞:

(1) 本地文件包含:

  • 一般存在于模塊加載,模板加載,cache調(diào)用

  • 包括函數(shù):include()/include_once(),require()/require_once()尋找可控變量

(2) 遠(yuǎn)程文件包含:

  • 前提條件:allow_url_include = on

  • 出現(xiàn)頻率不如本地包含

(3) 文件包含截?cái)啵?/p>

  • %00截?cái)?php版本小于5.3)

  • 問(wèn)號(hào)截?cái)?問(wèn)號(hào)后面相當(dāng)于請(qǐng)求的參數(shù),偽截?cái)?

  • 英文(.) 反斜杠(/) 截?cái)?/p>

2.文件讀取(下載)漏洞:

搜索關(guān)鍵函數(shù):

file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()

3.文件上傳漏洞:

搜索關(guān)鍵函數(shù):

move_uploaded_file() 接著看調(diào)用這個(gè)函數(shù)的代碼是否存在為限制上傳格式或者可以繞過(guò)。

(1) 未過(guò)濾或本地過(guò)濾:服務(wù)器端未過(guò)濾,直接上傳PHP格式的文件即可利用。

(2) 黑名單擴(kuò)展名過(guò)濾:

  • 限制不夠全面:IIS默認(rèn)支持解析.asp,.cdx, .asa,.cer等。

  • 擴(kuò)展名可繞過(guò):

不被允許的文件格式.php,但是我們可以上傳文件名為1.php(注意后面有一個(gè)空格)

(3) 文件頭 content-type驗(yàn)證繞過(guò):

  • getimagesize()函數(shù):驗(yàn)證文件頭只要為GIF89a,就會(huì)返回真。

  • 限制$_FILES['file']['type']的值 就是人為限制content-type為可控變量。

(4) 防范:

  • 使用in_array()或 利用三等于===對(duì)比擴(kuò)展名。

  • 保存上傳文件是重命名,規(guī)則采用時(shí)間戳拼接隨機(jī)數(shù):md5(time() + rand(1,1000))。

4.文件刪除漏洞:

搜索關(guān)鍵函數(shù):

  • unlink()利用回溯變量的方式

  • 老版本下的session_destroy(),可以刪除文件,現(xiàn)已基本被修復(fù)。

Metinfo的任意文件刪除漏洞:

$action = delete即可刪除.sql的文件,如果文件不是sql直接刪除提交的文件名

target.com/recovery.php?&action=delete&filename=../../index.php

b.代碼執(zhí)行漏洞

1.代碼執(zhí)行函數(shù):

搜索關(guān)鍵函數(shù):eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()

(1) preg_replace()函數(shù):

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

當(dāng)$pattern處存在e修飾符時(shí),$replacement 會(huì)被當(dāng)做php代碼執(zhí)行。

(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…)

第一個(gè)參數(shù)為回調(diào)函數(shù),第二個(gè)參數(shù)是回調(diào)函數(shù)的參數(shù)

(3)eval()assert()

當(dāng)assert()的參數(shù)為字符串時(shí) 可執(zhí)行PHP代碼

【區(qū)分】:

eval(' phpinfo(); ');【√】 eval(' phpinfo() ');【X】assert(' phpinfo(); ');【√】 assert(' phpinfo() ');【√】

2.動(dòng)態(tài)函數(shù)執(zhí)行:

動(dòng)態(tài)函數(shù)后門:

1
2
3
<>
$_GET['a']($_GET['b']);
>

3.命令執(zhí)行函數(shù):

搜索關(guān)鍵函數(shù):system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()

(1) popenproc_open()

1
2
3
popen( 'whoami >> /Users/bingdaojueai/Desktop/1.txt', 'r' );
>

所在路徑就會(huì)出現(xiàn)一個(gè)1.txt 里面的內(nèi)容為命令執(zhí)行后的結(jié)果

(2) 反引號(hào)命令執(zhí)行:

  • echo whoami; 直接就可以執(zhí)行命令

  • 雙引號(hào)和單引號(hào)的區(qū)別:

    1
    2
    3
    $a = 1
    echo ' $a '    output:1
    echo ' $a '    output:$a

雙引號(hào)時(shí),可以直接解析變量,造成代碼執(zhí)行漏洞,過(guò)狗繞過(guò)。

c.變量覆蓋漏洞

1.函數(shù)使用不當(dāng):

  • int extract( array &$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )

  • void parse_str( string $str , array &$arr )

  • bool import_request_variables( string $type , string $prefix )

2.$$變量覆蓋:

d.邏輯漏洞

需要思考的問(wèn)題:

  • 程序是否可以重復(fù)安裝

  • 修改密碼是否存在越權(quán)修改其他用戶密碼

  • 找回密碼驗(yàn)證碼是否可以暴力破解

  • cookie是否可以預(yù)測(cè) 驗(yàn)證存在繞過(guò)

1.等于與存在判斷繞過(guò):

(1) in_array(): 比較之前會(huì)自動(dòng)轉(zhuǎn)換類型

(2)is_numeric():當(dāng)傳入?yún)?shù)為hex時(shí) 直接通過(guò)并返回true 并且MYSQL可以直接使用hex編碼代替字符串明文 可以二次注入 并且可能造成XSS漏洞

(3)雙等于==和三等于===

  • 雙等于會(huì)在變量比較時(shí),進(jìn)行類轉(zhuǎn)換,與in_array()是一樣的問(wèn)題。

  • 三等于是typevalue的雙重比較,相比之下更加安全。

2.賬戶體系中的越權(quán)問(wèn)題:

  • 水平越權(quán):A用戶能夠以B用戶的身份,進(jìn)行B用戶的全部權(quán)限操作。前提A用戶和B用戶擁有相同的權(quán)限。

  • 垂直越權(quán):A用戶能夠以C用戶的身份,進(jìn)行C用戶的全部權(quán)限操作,前提C用戶比A用戶擁有更高的權(quán)限。

(1) 未exit/return/die

1
2
3
4
5
6
7
<>
if(file_exists('install.lock)){
    header('Location:xxx.com');
    //exit();
}
echo 'test';
>

test 依舊會(huì)被輸出,替換成安裝流程,PHP依舊會(huì)進(jìn)行。

(2) 支付漏洞:

  • 客戶端修改單價(jià)

  • 客戶端修改總價(jià)和購(gòu)買數(shù)量

  • 服務(wù)端未校驗(yàn)嚴(yán)格

  • 重復(fù)發(fā)包利用時(shí)間差:

    1
    2
    3
    4
    5
    6
    7
    <>
    if (check_money($price)){
      //Do something
      //花費(fèi)幾秒
      $money = $money - $price;
    }
    >

可能導(dǎo)致漏洞函數(shù): str_replace()

1
2
3
4
5
6
7
<>
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo '$a
$b
'
;
$c = str_replace($a,'',$b);
echo trim($c);
>

e.會(huì)話認(rèn)證漏洞

  • COOKIE驗(yàn)證:沒有使用SESSION驗(yàn)證,將信息直接保存在COOKIE中

    1. 找到傳入sql語(yǔ)句的參數(shù)的傳遞過(guò)程 回溯變量到最原始的函數(shù) 看它保存在cookie的算法 是否可逆

    2. 和MD5比起 sha1更安全 解密sha1的網(wǎng)站更少

    3. 限制一個(gè)用戶只能同時(shí)在一個(gè)IP上登錄

  • 審計(jì)代碼時(shí),查看登錄處代碼

f.二次漏洞

1.類型:

  • 不是邏輯問(wèn)題,是可信問(wèn)題。

  • 業(yè)務(wù)邏輯復(fù)雜度,與二次漏洞觸發(fā)率 成正比。

  • 購(gòu)物車 / 訂單 / 引用數(shù)據(jù) / 文章編輯 / 草稿 ==> SQL注入 / XSS

2.技巧:

(1) 鉆GPC等轉(zhuǎn)義的空子:

  • 不受GPC保護(hù)的$_SERVER變量:PHP5以后,$_SERVER取到的header不再受GPC影響,就算開啟特殊字符也不會(huì)被轉(zhuǎn)義,存在注入

  • 編碼問(wèn)題轉(zhuǎn)換:

    1. GBK的寬字節(jié)注入:%df ' 單引號(hào)自動(dòng)被轉(zhuǎn)義成(%5c),同時(shí)%df%5c連在一起組合成運(yùn)字單引號(hào)依然在,成功閉合?!緋hp與mysql交互過(guò)程中發(fā)生的編碼轉(zhuǎn)換問(wèn)題】

    2. mb_convert_encoding()

      1
      2
      3
      4
      5
      'Content-Type' content='text/html;charset=utf-8'/>
      <>
      $sql = 'WHERE id=''.urldecode('-1%df%5c' == ').''';
      print_r(mb_convert_encoding($sql,'UTF-8','GBK'));
      >

(2)字符串問(wèn)題:

  • 利用報(bào)錯(cuò),找到敏感信息

  • 字符串截?cái)啵?/p>

    1. %00空字符截?cái)啵骸綪HP版本小于5.3】

      1
      2
      3
      4
      5
      include($_GET['file'].'.php');     
      //1.php?file=2.txt%00
      //2.txt里面是
      >
    2. iconv函數(shù)字符編碼轉(zhuǎn)換截?cái)啵骸緦?duì)PHP版本有要求】

      1
      2
      3
      4
      5
      6
      chr(128)—chr(255)可以截?cái)嘧址?/code>
      $a = '1'.chr(130).'2’;
      echo $a.'
      '
      ;                   //1?2
      echo iconv('UTF-8', 'GBK', $a);   //1
      >
  • php:// 輸入輸出流:

    1
    2
    3
    4
    <>
        include($_GET[‘file']);
    >
    1.php?file=php://filter/convert.base64-encode(內(nèi)容被base64編碼)/resource=example.txt(遠(yuǎn)程文件)
  • php代碼解析標(biāo)簽:

    1. php3.0.4版本后可用

    2. <%…%>asp標(biāo)簽,需要asp_tags=on,默認(rèn)是off

  • 正則表達(dá)式:

    1. 沒有使用^ 和 $ 限定匹配開始位置:

    2. 特殊字符未轉(zhuǎn)義:

  • 報(bào)錯(cuò)注入:

  • windows findfirstfile 利用:若要搜索12345.txt文件,可使用1來(lái)代替或者12,不可以單獨(dú)使用一個(gè)'<>'>',因?yàn)閱为?dú)一個(gè)只是代表了一個(gè)字符,兩個(gè)代表多個(gè)字符。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多