SQL注入入门

文章的内容包括SQL注入的原理与应用
入门小白进阶SQL的文章

“SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中添加恶意语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。”

1.SQL注入介绍

1.1 SQL注入原理

   前端构造的SQL语句片段拼接到后台SQL语句中,后台缺乏正确识别和过滤,造成与其外的数据库查询结果。在php中,一般会用$_GET[‘id’]或者$_POST[‘id’]来接收传入的id,通过GET获取了id参数的值,然后把id传给了那条数据库语句让它查询。

1.2 SQL注入危害

  从技术上来说:未授权、非法增删改查数据库内容,包括窃取信息、删除数据库、读写系统文件、执行命令等等。

  从影响上来说:客户数据丢失、系统交易数据被篡改、网站首页被篡改。

1.3 SQL注入分类
  • 按照后台处理前端提交参数的类型来分,分两类:
  • 数字型注入和字符型注入。
  • 按照请求方式分:GET、POST
  • 按照其他分类方法,还有一些常见数据库注入类型:报错注入、盲注、延时注入、宽字节注入、二次注入、堆叠注入。

2.SQL注入利用

2.1 利用步骤

  联合查询>报错>布尔盲注>延时盲注

  宽字节注入、二次注入(代码审计)

2.2 MySQL数据库
2.2.1 MySQL函数
1
substr(var1, var2, var3)

  功能:从字符串里截取其中一段字符(串)

  • var1:被截取的字符串
  • var2:从哪一位开始截取
  • var3:截取长度
1
ascii(var)

  功能:取var字符的ascii码(十进制)

1
if(var1,var2,var3)
  • var1: 条件
  • var2:条件为真时返回的值
  • var3:条件为假时返回的值
1
sleep(var)

  功能:暂停执行var秒,var可以用小数


3.SQL注入挖掘

3.1 攻击思路
  1. 判断是否动态网站

  2. 找注入点

  3. 判断数字型、字符型

  4. 如果是字符型,则需要判断闭合符

    • 如果尝试作为闭合符的字符是闭合符中的一个,那么会报错;
    • 尝试多个输入点进行判断,尤其是要发掘新功能的输入点
    • 如果尝试作为闭合符的字符并非是闭合符,那么它会被当成普通字符处理,不会报错(报错不等同于查询不出来);
  5. 后台SQL语句

    • 掌握查询当前库名的函数database();

    • 掌握判断闭合符的方法;

    • 掌握information_schema库与SQL注入相关的用法;

    • 掌握union查询及其条件;

    • 掌握concat、concat_ws、group_concat的用法;

    • 掌握双引号等特殊字符的查询,要用到转义符\;

3.2 SQL挖掘点
  • 与数据库交互的页面,如:带xxx?id=xx
  • 登录、更新、注册、留言板、验证等等
  • 在数据包中可能出现的地方:http头、cookies、referer、user、agent、post提交数据包的地方等等。
3.3 注入点判断方法

   单引号法:即直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,且浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。

   1=1和1=2法:很多时候检测提交包含单引号的链接时,会提示非法字符,或者直接不返回任何信息,但这并不等于不存在SQL注入漏洞。此时可使用经典的“1=1和1=2”法进行检测。方法很简单,就是直接在链接地址后分别加上and 1=1和and 1=2进行提交,如果返回不同的页面,那么说明存在SQL注入漏洞。


4.SQL注入绕过

编码字符串

  • char()
1
如:select(char(67,58,92,92,84,69,83,84,46,116,120,116));
  • 16进制编码
1
如:0x633a2f77616d702f7777772f666c61672e747874
  • hex
  • unhex()
1
如:select convert(unhex(‘E698A5E79CA0’) using utf8);
  • to_base64(), from_base64():mysql 5.6后支持
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
过滤绕过:

and->&&

or->||

=、>、<用between()函数、like关键字绕过

空格->+,/**/

imit 0,1用limit 0 offset 1绕过

substr用mid、substring绕过

sleep用benchmark绕过

大小写绕过

内外双写绕过

内联注释绕过/**/

%00等空白符嵌入绕过WAF

超大数据包绕过

双提交绕过

异常请求方法绕过
谢谢大家欣赏文章!
------ 本文结束感谢您的阅读 ------