SQL注入入门

阅读前说明:阅读改文章之前建议先阅读LAMP渗透学习基础知识文章;利用了google的hackbar插件,靶场是sqli-labs;

一、原理

例如:用户登录的基本 SQL 语句:select * from users where username = '用户输入的用户名'and password = '用户输入的密码'

用户输入的内容是可控的,例如我们可以在用户名中输入admin' or 1=1 -- +就变成了:select * from users where username = 'admin' or 1=1 -- +'and password = '用户输入的密码'
 
说明:这样就导致该SQL语句没有了密码验证过程,而其中的or 1=1让整条SQL语句变成了永真语句,结果就是会查询所有的用户名。(注:-- +在mysql当中是注释的意思。)

二、SQL注入分类

注:以下所有注入方式都可能是GET方式或者POST方式进行注入,如果是POST方式,则利用BurpSuite工具进行抓包注入即可(示例为HTTP头注入)。

1.布尔注入:可以根据返回页面判断条件真假的注入;(盲注--猜!)

流程:

1.判断是否存在注入点(重中之重)下面流程一般用脚本
2.猜解当前数据库名称,注:需要先猜解名称的长度
3.猜解数据库中的表名,注:需要先猜解名称的长度
4.猜解表中的字段名,注:需要先猜解字段的数量
5.猜解数据,注:需要先猜解数据的记录数,再对每个字段的长度和数据进行猜解

如下简单示例1:

页面显示正常,若后面的and不满足则该页面显示不正常

 

 

进阶示例2:

 

 说明:

substr(database(),1,1) 表示取出数据库名称的第一个字符,第一个 1 表示从第几个字符开始,第二个 1 表示取几个字符,我们猜解出一个值之后就要把第一个值+1 用来猜解第二个值。

ascii()将取出来的字符转为ASCII码,然后去对照ASCII表去查看具体是哪个字符。

2.联合注入:可以使用 union 的注入;

(1)简单介绍

 

 (2)查看当前数据库名称,利用database()函数

 

 (3)查看当前用户(权限),利用user()函数

 

 (4)查看数据库路径,利用@@datadir 

 

(5) 查看操作系统版本,利用@@version_compile_os

 

 (6)查看数据库版本信息,利用version()函数

 

(7)查看当前数据库中所有表的名称,利用group_concat()函数将查询结果一条显示(可以理解为整合拼接所有查询的结果数据);同理可查询表中字段的名称

 

 (8)有了字段的名称(username,password),往下就好办了啊,如下图所示

 

 说明:0x3a在ASCII码中是 :的意思

 

3.延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;(盲注--猜!)

介绍:基于时间的则是使用 if 语句进行判断数值,不符合判断条件则执行 sleep 语句。从而造成页面的响应时间变长,根据页面的响应时间来判断结果。 
示例:if(x,1,sleep(3))   类似于三元运算符

 

若将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 注入

posted @ 2022-01-29 15:42  hithub  阅读(207)  评论(0编辑  收藏  举报