通过sqli-labs学习sql注⼊——基础挑战之less1
环境准备:
Phpstudy (PHP+Apache+Mysql)
Sql-lab
⾸先了解下基础知识:
URL编码:
因为涉及到Mysql数据库,在插⼊数据库语句时会⽤到Mysql数据库的注释符
Mysql⽀持三种注释⽅式:
1.从‘#'字符从⾏尾。
2.从‘-- '序列到⾏尾。请注意‘-- '(双破折号)注释风格要求第2个破折号后⾯⾄少跟⼀个空格符(例如空格、tab、换⾏符(⽤%20或者+表⽰空格)等等)。
3.从/*序列到后⾯的*/序列。结束序列不⼀定在同⼀⾏中,因此该语法允许注释跨越多⾏。
SQL⼿⼯注⼊的基本流程:
1、⾸先判断是什么类型的注⼊,有没过滤了关键字,能不能通过加⼊注释符绕过
2、接着获取当前数据库⽤户,版本,当前连接的数据库等信息。
3、然后⼀般是获取⽤户账户密码的那个数据库表的信息
4、接着获取列信息
5、最后就获取数据了
为了⽅便学习查看,可以在源码中的$sql下⼀句语句写以下php语句(就是输出拿到数据库查询的完整语句是怎么样的)echo "你的 sql 语句是:".$sql."<br>";
Less-1 -- GET-Error based - String quotes (报错型注⼊)
sql容易学吗根据提⽰信息,给URL传⼊参数,然后查看输⼊不同的值页⾯返回的数据的不同
尝试如果输⼊的值id不是整数,那么我们可以传⼊⼀个⾮整数来看看,则不会返回数据;
第⼀步:判断注⼊点是否存在
通过替换id的值可以肯出页⾯返回的信息是不同的,经尝试所以⼿贱的尝试添加个引号
在参数id后加上引号后发现页⾯报错,这⾥可以看到报错信息直接显⽰在页⾯上,根据报错信息可以看出数据库是Mysql数据库的。在测试SQL注⼊时,如果页⾯上没有很明显的报错信息时,可以将数据包放到Burp中观察返回数据包的⼤⼩来判断。
由上图可以看出报错信息是:
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 ''8'' LIMIT 0,1' at line 1
从报错信息中可以看出来⼀部分SQL语句:
’ 8’ ’ LIMIT 0,1
在这⾥的8' 是我们传⼊的参数,从报错信息⼤致可以才出来后台SQL语句形式
select XXX, XXX from users where id='$_GET[id]' limit 0,1
那么结合我们刚刚传⼊的id值则可以组成的SQL语句⼤致为:
select XXX, XXX from users where id=' 8’ ' limit 0,1
如果是在Mysql数据库中传⼊畸形参数-⽐如说单引号,数据库语句就⽆法执⾏,会⼀直处于等待闭合的状态,但是对于SQL执⾏语句来说,它会认为这是⼀个错误的SQL语句,并且返回⼀个错误提⽰信息。所以此时我们应该闭合单引号或者是注释掉单引号。
select XXX, XXX from users where id=' 8’ ‘ ' limit 0,1
或者注释掉后⾯的单引号
select XXX, XXX from users where id=' 8’ -- ' limit 0,1 (’-- ’ 采⽤双短线+空格注释后⾯的语句)
或
select XXX, XXX from users where id=' 8’ # ' limit 0,1 (采⽤’#‘注释)
由上⾯两幅图可以看出,数据正常返回,说明SQL语句正常执⾏了,后⾯的单引号被注释了
注意点:
1、为什么是 ‘--+’ ⽽不是 ‘—‘
因为这⾥字符 ‘-‘ 和字符 ‘+‘ 在URL中都是有固定的含义的 , ⽐如说 ‘+’ 就在URL编码中就代表空格 , ⽽URL编码中 ‘-‘ 不⽤编码
2、为什么 ‘--+’ 没有被URL
因为由于这⾥我们是⽤+代替了空格, 因此不需要进⾏编码 , 我们也可以不⽤ ’+’ ⽽使⽤空格的URL编码 , 那么编码得到的URL就应该是 : 192.168.139.131/sqli-lab/Less-1/?id=8' --%20
3、’#’ ⼜为什么必须得编码,不编码不可以吗?
不可以 , 因为 ’#’ 在URL中是有固定的含义的 , 表⽰页⾯中的锚点 , 如果不进⾏编码浏览器就会将其当成页⾯的锚点 , ⽽这⾥我们是需要将其作为数据传输给服务器的 , 因此需要进⾏URL编码。
现在我们能控制的字段是id后⾯传⼊的参数,然后拼接到原来的SQL语句中执⾏,所以通过构造传⼊不同的id参数,达到控制系统内执⾏我们所需要的SQL语句。
所以接下来第⼆步:猜解字段长度
192.168.139.131/sqli-lab/Less-1/?id=8' order by 3 --+
从上⾯对⽐可以看出,数据库中字段值为3
通过Order by X 判断数据库中字段数,如果X是⼩于等于数据库中字段值页⾯则会返回正常数据,如果X⼤于数据库中字段值也会则会出错
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论