前言
在我挖了一段时间的教育src后,虽然自己有0day,但是还是发现自己的代码审计能力有很大的欠缺,所以,就写了我的第一次的代码审计过程。
前端
首先先看一下index.php的源码
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名,只接受了一个文件名,可能存在漏洞
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
其中对于通过GET得到的参数并没有进行过滤,所以我们可以利用此参数来进行越级访问,这里我事先在文件夹里放了一个phpinfo的php文件
接下来来看file中的index.php文件,看下源码
其中在开始包含了几个文件,由于是在代码中是写死的,所以无法利用其进行进一步操作,再接着往下看,将SELECT * FROM settings这个MySQL的查询语句直接赋值给query变量,接下再利用mysql_query函数进行查询返回的是一个指针类型,将其再利用mysql_fetch_qrrqy函数得到具体的值,并赋值给info变量,接下的代码中类似info[‘keywords’]相当于从info这个变量中取值,接下来我们接着往下看,忽略写死的文件包含和没有什么卵用的从info变量中取值,我发现在第34行处有一个很有趣的herf,首先它给了我们参数?r=content&cid=,我们在访问这个cms的某一篇文章时url参数为:http://127.0.0.1/dmsj2/?r=content&cid=5,很显然这里的参数有点意思,它首先能够和我i们有交互,同时还与MySQL有联系,所以就意味着有注入,接下来我们跟进以下这个参数,由于其中?r=content,所以就去content.php中看一看,
在第8行对这个传入的参数做了一定的过滤,过滤函数为addslashes函数,它的主要作用为将传入的参数中的单引号,双引号等符号前加斜杠,也就意味着我们平常的注入方法肯定不行所以就要利用其他的注入方法,由于这个代码在第19行处直接引用了id参数并美哦与及逆行再次过滤,所以就产生了注入,这里我利用的是报错住注入(宽字节注入我注不出来),
//注入语句
http://127.0.0.1/dmsj2/?r=content&cid=2 or (select%20extractvalue(1,concat(0x7e,(select%20database()))))
同样的在index.php的第86行也有这样的注入漏洞,
我们对这个id参数跟进一下,
发现这里也是之利用了addslashes函数进行了过滤,在第13行处没有进行二次过滤,所以可以利用报错注入进行利用
pyload为:
?r=software&cid=2%20or%20(select%20extractvalue(1,concat(0x7e,(select%20database()))))
目前在index.php中的漏洞代码我已知的就这么多,
接下来去其他的php文件中找找看还有没有漏洞,查看了about.php的代码,以为在对传入的r这个参数进行了过滤的话可能是存在注入,结果没有,接下来看contact.php,里边有对r和page这两个GET请求的参数都做了函数过滤,加上后边的语句闭合必须要用到单引号,所以就没有注入了,不过,查看源代码发现对于page参数没有做很严格的过滤,
所以其存在xss,playload为:
http://127.0.0.1/dmsj2/?r=contact&page=1<script>alert(1)</script>
再往下看就没有什么能够注入的地方了,直接换下一个PHP文件。
接着是content.php文件,此文件存在一个报错注入,在上边已经说过了,我们接着往下看,中间要么是写死的SQL查询语句,要么是需要我们利用单引号闭合,加上边函数的过滤所以没有注入,直到在第154行处,留言的功能处,有一个传参的php,
跟进一下,查看一下submit.php这个php文件代码,上来就看见传入不少的参数(很快啊),先是整一手session再进行函数过滤,瞬间感觉就不友好了(啪的一下快乐没了),接着往下看在第66行处,发现对mail没有进行过滤,
所以直接注它,这里我由于本地环境的原因对这个cms进行了重装(嫖别人已经搭建好的cms),所以接下来的url和上边不一样,
接着上边的注入,利用burp对mail参数进行注入
')%20and%20updatexml(1,concat(0x7e,user()),1)#
得到回显
再接着往下看,在第176行处,对没有过滤的cid参数进行直接利用,所以直接注它
payload为:
)%20and%20updatexml(1,concat(0x7e,user()),1)#
得到回显
不过值得注意的是如果想要利用cid进行注入,是有前提条件的,在submit.php代码的第150行处需要pltz这个参数为1,在105行的注释中表明这个参数为新留言评论通知,具体设置需要在后台的高级设置中,新评论通知站长处打勾。
几处其他的xss:
在前端留言处的昵称和留言内容处由于没有对输入的内容进行限制,如果我们留言内容为xss代码则会导致xss,同时由于留言是需要存储在数据库中的,所以这为存储型的xss,具体演示过程就不再展示了。
后端
index.php
先访问admin目录下的index.php,相对于前端的index.php,admin目录下这个直接把get的参数在index中利用函数进行了过滤,但是仍存在越权访问的漏洞,
login.php
接下来看login.php的代码,首先对于用户名没有进行过滤,所以直接报错注入,
file/index.php
再回过头来看file/index.php,开头看到了包含了其他的PHP文件,con.php是连接数据库的文件,checklogin.php则是登陆检验,
其源代码为:
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
在checklogin.php中对于cookie只做了是否为空的验证,所以,直接整一个不为空的cookie可直接绕过登录,
接往下看,全是写死的SQL查询语句,直接下一个
查看adset.php文件,首先是利用post的方式传入三个参数,但是由于addslashes函数的过滤,且如果要注入的话需要用到单引号闭合,所以这里没有注入漏洞,往下看也全是前端代码,所以直接下一个
columnlist.php
查看columnlist.php文件,为删除模块,上来就看见两个get请求,往下看没有对参数进行过滤,所以直接利用删除注入,payload:
?r=columnlist&delete=3'%20and%20(select%20extractvalue(1,concat(0x7e,(select%20database()))))%20and%20'
这里由于我自己对于删除注入的格式不了解导致卡壳,果然还是太菜了,一般的删除注入格式如下:
'or(有效载荷)or'
'and(有效载荷)and'
'or(有效载荷)and'
'or(有效载荷)and'='
'*(有效载荷)*'
'or(有效载荷)and'
"- (有效载荷) - "
往下看就都是写死的SQL语句了,所以换下一个
接下来是commitlist.php文件,是后台对评论管理的文件,查看源码,在第31行处get请求了删除参数,往下直接对其没有进行过滤就直接进行利用,所以和上边一样直接利用报错注入,再往下的有关SQL的语句就都是写死的查询和输出了。
editcolumn.php
查看源代码,上来就是get参数,且没有对id这个进行过滤就直接利用,所以直接利用报错注入注它,payload为:
?r=editcolumn&type=1&id=1'%20or%20(select%20extractvalue(1,concat(0x7e,(select%20database()))))or%20'
再往下的源码中对我们写的东西完全没有过滤且存储到了数据库中,所以可以写xss的代码形成存储型xss,具体的演示工程就不再演示了(我的后台被自己玩xssx崩了一次),再往下就没什么可以利用的了。
editlink
直接上源码
这个页面的漏洞和上边的editcolumn.php是一样的所以这里就不多说了
xss漏洞
在看过几个php文件之后,在manageinfo.php,newcolumn.php,editsoft.php,new.php,newsoft.php,newwz.php,seniorest.php,siteset.php,由于对输入的数据没有经过过滤,所以可以将xss单吗写入,导致存储型的xss.
reply.php
由于对于回复评论的内容没有进行限制,所以存在存储型xss,同时get请求的参数id没有进行过滤,所以出现了和上边一样的SQL注入。
至于softlist.php和walist.php则存在delete的报错注入,其payload为:
?r=columnlist&delete=3'%20and%20(select%20extractvalue(1,concat(0x7e,(select%20database()))))%20and%20'