SQL注入入门
阅读前说明:阅读改文章之前建议先阅读LAMP渗透学习基础知识文章;利用了google的hackbar插件,靶场是sqli-labs;
一、原理
例如:用户登录的基本 SQL 语句:select * from users where username = '用户输入的用户名'and password = '用户输入的密码'
二、SQL注入分类
注:以下所有注入方式都可能是GET方式或者POST方式进行注入,如果是POST方式,则利用BurpSuite工具进行抓包注入即可(示例为HTTP头注入)。
1.布尔注入:可以根据返回页面判断条件真假的注入;(盲注--猜!)
流程:
1.判断是否存在注入点(重中之重)下面流程一般用脚本
2.猜解当前数据库名称,注:需要先猜解名称的长度
3.猜解数据库中的表名,注:需要先猜解名称的长度
4.猜解表中的字段名,注:需要先猜解字段的数量
5.猜解数据,注:需要先猜解数据的记录数,再对每个字段的长度和数据进行猜解
如下简单示例1:
页面显示正常,若后面的and不满足则该页面显示不正常
进阶示例2:
说明:
substr(database(),1,1) 表示取出数据库名称的第一个字符,第一个 1 表示从第几个字符开始,第二个 1 表示取几个字符,我们猜解出一个值之后就要把第一个值+1 用来猜解第二个值。
2.联合注入:可以使用 union 的注入;
(1)简单介绍
(2)查看当前数据库名称,利用database()函数
(3)查看当前用户(权限),利用user()函数![](https://img2022.cnblogs.com/blog/2727822/202201/2727822-20220129163651086-510772783.png)
(4)查看数据库路径,利用@@datadir ![](https://img2022.cnblogs.com/blog/2727822/202201/2727822-20220129163840682-104870728.png)
(5) 查看操作系统版本,利用@@version_compile_os
(6)查看数据库版本信息,利用version()函数
(7)查看当前数据库中所有表的名称,利用group_concat()函数将查询结果一条显示(可以理解为整合拼接所有查询的结果数据);同理可查询表中字段的名称
(8)有了字段的名称(username,password),往下就好办了啊,如下图所示
说明:0x3a在ASCII码中是 :的意思
3.延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;(盲注--猜!)
![](https://img2022.cnblogs.com/blog/2727822/202201/2727822-20220129195015237-154375381.png)
若将115改为116则发现下图响应时间变成了3秒
4.报错注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
(1)count和group by报错:
(2)extractvalue(XML_document, XPath_string)或updatexml(XML_document, XPath_string, new_value)函数
原理:
XPath_string 表示 xml 中的位置是可操作的地方,xml 文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,例如写入"select database()"而返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
示例:该示例利用了BurpSuite进行抓包,然后进行http头注入(对user-agent),想要知道为什么可以去审计源代码。(单引号闭合)
三、闭合方式
(1)or 1=1 -- +(什么都没有闭合方式)
(2)' or 1=1 -- +(单引号闭合方式)
(3)" or 1=1 -- +(双引号闭合方式)
(4)) or 1=1 -- +(单括号闭合方式)
(5)') or 1=1 -- +
(6)") or 1=1 -- +
(7)")) or 1=1 -- +
注:通常利用转义符 ‘\’ 来判断闭合方式(有报错提醒才能看的出来如下图)。------ 单引号闭合
否则用脚本跑所有的闭合方式(sqlmap)。
四、补充
常见HTTP头注入点:
1. User-Agent 注入
2. Referer 注入
3. Cookie 注入