OS Command Injection
界面:
给一个域名,它帮你返回DNS
代码:
1 <div id="main"> 2 3 <h1>OS Command Injection</h1> 4 5 <form action="<?php echo($_SERVER["SCRIPT_NAME"]);?>" method="POST"> 6 7 <p> 8 9 <label for="target">DNS lookup:</label> 10 <input type="text" id="target" name="target" value="www.nsa.gov"> 11 12 <button type="submit" name="form" value="submit">Lookup</button> 13 14 </p> 15 16 </form> 17 <?php 18 19 if(isset($_POST["target"])) //获取域名,如果存在输入 20 { 21 22 $target = $_POST["target"]; 23 24 if($target == "") //如果域名为空 25 { 26 27 echo "<font color="red">Enter a domain name...</font>"; //请输入域名 28 29 } 30 31 else 32 { 33 34 echo "<p align="left">" . shell_exec("nslookup " . commandi($target)) . "</p>"; 35 36 } 37 38 } 39 40 ?> 41 42 </div>
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
防御部分
1 function commandi($data) 2 { 3 4 switch($_COOKIE["security_level"]) 5 { 6 7 case "0" : 8 9 $data = no_check($data); 10 break; 11 12 case "1" : 13 14 $data = commandi_check_1($data); 15 break; 16 17 case "2" : 18 19 $data = commandi_check_2($data); 20 break; 21 22 default : 23 24 $data = no_check($data); 25 break; 26 27 } 28 29 return $data; 30 31 } 32 33 ?>
1.low
low级别没有过滤
加一个;就能实现恶意
2.medium
1 function commandi_check_1($data) 2 { 3 4 $input = str_replace("&", "", $data); 5 $input = str_replace(";", "", $input); 6 7 return $input; 8 9 }
过滤了&和;将他们替换为空
用 | 可以绕过
3.high
1 function commandi_check_2($data) 2 { 3 4 return escapeshellcmd($data); 5 6 }
escapeshellcmd函数功能:
反斜线()会在以下字符之前插入: &#;`|*?~<>^()[]{}$, x0A 和 xFF。 ' 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。