本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。
最近做了有几个师傅们找我做一个对应的代码审计,要求前台RCE但是最终没有实现对应功能,只找到了一个后台的注入点,这里分享一下审计的思路。
二、鉴权分析
这个文件架构其实很清楚,就是非框架类型的,先来进行查看鉴权。
这里直接进行鉴权查看,是因为前台可以访问的地方基本看了下,排查了函数move_uploaded_file文件上传,copy\fwrite\fputs\copy\renamefile\file_put_contents这几个常见rce的函数,并没有找到,这里贴一张图。
于是想着进行前台寻找SQL注入的地方,但发现均存在预编译以及过滤。例如这种方式,进行了转义,同时又进行排查对应的非字符型注入,尝试绕过这个函数没有结果,于是开始看鉴权,从鉴权地方看看能否做文章了。这里可以看到调用对应的参数islogin变量,如果为1则放行,查看这个变量。这里可以看到,获取我们Cookie当中的admin_token信息,并且进行解密,同时进行分割为user、id、以及时间三种格式,其中通过conf获取admin_user以及admin_pwd的信息,在进行添加一个密码的盐值进行md5加密,最后进行比较,查看加密的md5是否和sid相同,如果相同默认具备后台权限。
可以看到一个解密,一个加密,加解密函数就不看了,这里我们来推测一下。三、鉴权绕过(失败)
这里首先鉴权的admin_user是就是管理员账号,admin_pwd是管理员密码,后面password_hash是加密的盐值,三个组合在一起进行md5加密,并且与Cookie当中admin_token当中通过\t分离出来的第二个参数来进行md5比对,这里写一个小demo来生成一个正常的值。
这是加密的代码,固定对应的账号密码等信息,加密结果如下:
7dc74lFTKXYo0ULE69Uax+mhT3RRcC/AfaE86rtGZIiFdAn73K2HDtiY2LWC8yFAiWr1YrZHY2rbSK18rW9bVVgBSk5L1ZF9Ip0dlwxj
然后再编写一个小demo来进行解密。
解密出来的数据如下:
admin 5e2f212328fea275e18ce8714e71b18c 1771332095
这里就想到了一个办法,可以尝试进行php经常在CTF题目中喜欢考的PHP弱比较,这里查阅资料可以知道,MD5当中弱比较如果两个M5是0e开头的那么比较结果为true。
刚好这里进行的是弱比较的方式,尝试验证一下。
于是我这里开始赌,就进行加密赌对方网站账号密码在进行md5之后是0e开头的,我进行伪造,于是我这里自己搭建网站把自己密码更改为md5加密之后是0e开头的。
最终实现如下,可以正常加解密,第二个字段也是0e开头,于是这里进行验证是否可以直接进入后台。
但是直接失败了,这里也找到了失败原因。
这里人家进行校验的时候,账号+密码+密码盐值进行md5加密,我在赌这三个加起来的md5加密之后是0e开头的。
况且后面查资料表示:
QNKCDZO110e8304004519934940580242199033912406107080e462097431906509019562988736854s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469s214587387a0e848240448830537924465865611904s214587387a0e848240448830537924465865611904s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675s1885207154a0e509367213418206700842008763514s1502113478a0e861580163291561247404381396064s1885207154a0e509367213418206700842008763514s1836677006a0e481036490867661113260034900752s155964671a0e342768416822451524974117254469s1184209335a0e072485820392773389523109082030s1665632922a0e731198061491163073197128363787s1502113478a0e861580163291561247404381396064s1836677006a0e481036490867661113260034900752s1091221200a0e940624217856561557816327384675s155964671a0e342768416822451524974117254469s1502113478a0e861580163291561247404381396064s155964671a0e342768416822451524974117254469s1665632922a0e731198061491163073197128363787s155964671a0e342768416822451524974117254469s1091221200a0e940624217856561557816327384675s1836677006a0e481036490867661113260034900752s1885207154a0e509367213418206700842008763514s532378020a0e220463095855511507588041205815s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675s214587387a0e848240448830537924465865611904s1502113478a0e861580163291561247404381396064s1091221200a0e940624217856561557816327384675s1665632922a0e731198061491163073197128363787s1885207154a0e509367213418206700842008763514s1836677006a0e481036490867661113260034900752s1665632922a0e731198061491163073197128363787s878926199a0e545993274517709034328855841020
好像常见的只有这几个md5加密之后才是0e开头的。
最后我顺手给他代码改了,固定加密后是0e开头的。
这个点比较可惜,但是好在也是一个学习的过程,这里记录一下失败的过程,有大佬想到好的方法可以dd一起交流一下。
四、SQL注入
最后就是SQL注入了,这种漏洞还是比较好审计。
后台挺多这种可以直接注入的,但是前台却都进行了过滤,这里验证一下吧。
验证的时候发现没能成功,报这个错误。
发现这里还需要在session当中获取密码什么的,那咱就换一个点,也不从数据库当中看了,本身鉴权就让我更改了再去操作session等鉴权一类的信息而去审计出来的漏洞准确率就不高了。
可以验证一下这个点。
成功验证。
同时具备内部资料以及靶场相关福利,想要了解的师傅可以冲了。