查看原文
其他

SQL注入新手教程(第一部分)1

2017-06-10 hesir 看雪学院
SQL 注入是一种攻击者通过网页将 SQL 命令注入到 SQL 语句中的技术。攻击者可以绕过认证,访问、修改和删除数据库中的数据。在某些情况下,SQL 注入甚至可被用于执行操作系统级的命令,攻击者可能对防火墙后的网络带来破坏性更大的攻击。



常用数据库

  • MySQL(开源)

  • MSSQL

  • S-ACCESS

  • Oracle

  • Postgre(开源)

  • SQLite



SQL注入类型

  • In Band(带内注入)

  • Out of Band(带外注入)

  • Blind SQLI(盲注)



SQL注入开发技术

  • Error Based Exploitation(基于错误返回的注入)

  • Union Based Exploitation(基于联合查询的注入)

  • Boolen Based Exploitation(布尔型注入)

  • Time Based Exploitation(基于时间延迟注入)

  • Out of Band Exploitation(带外注入)



常见注入点——应用程序和数据交互的地方

  • Authentication(认证页面)

  • Search Fields (搜索页面)

  • Post Fields     (Post请求)

  • Get Fields      (Get请求)

  • HTTP Header(HTTP头部)

  • Cookie



常用SQL语句

SELECT

基于搜索条件从数据库中读取数据

INSERT

将新数据插入数据库

UPDATE

基于给定条件更新已有数据

DELETE

基于给定条件删除已有数据

Order By

对结果集按照升序或降序排列

Limit By

从一个或多个表中检索记录



常用SQL注入字符

1

字符串运算符

'or'

2

多行注释

/*...*/

3

加号,连接(在URL中等同于空格)

+

4

单行注释

#或--

5

双管道(连接)

||

6

通配符

%

7

局部变量

@

8

全局变量

@@

9

时延

waitfor delay '00:00:10'

10

字符串替代数字或数字替代字符串




数据库指纹

我们可以通过分析错误信息找出数据库类型。

首先从这里下载SQL注入测试平台,并且利用xampp搭建开放SQL注入实验平台。(译者注:可参考这篇博客)

点击 Setup/reset Database for labs




在进入 Dhakkan 实验平台之前,我们先了解一些基础知识。(数据库后端如何执行查询操作?查询是如何形成的?我们如何打破它?到底什么是SQL注入?)

想象一个需要输入用户名和密码的登录页面,当你输入用户名和密码后,后端就会产生并执行一条查询(SQL查询),登录后该查询结果会被显示在我们的主页。

例如:

Username - Raj

Password - Chandel

那么后端查询看起来是这样的:

SELECT * FROM table_name WHERE username='Raj' AND password='Chandel';

这完全取决于开发者是如何将参数值封装在SQL查询中的,可以是单引号、双引号和引号与括号结合使用等。所以查询可能看起来会是这样的:

SELECT * FROM table_name WHERE username='Raj' AND password='Chandel';

SELECT * FROM table_name WHERE username=('Raj') AND password=('Chandel');

SELECT * FROM table_name WHERE username="Raj" AND password="Chandel";

SELECT * FROM table_name WHERE username=("Raj") AND password=("Chandel");


或者是开发者选择的任何形式。这里以第一种查询为例进一步解释。

Q :如果输入的用户名为 Raj' 会发生什么?

A:如果输入的用户名为 Raj' ,后台查询看起来会是这样的

SELECT * FROM table_name WHERE username='Raj'' AND password='Chandel';


由于多了一个引号,所以此处有语法错误。

Q:怎样修复这条查询?可以修复吗?

A:上面的查询可以修复,即使输入的用户名仍为 Raj' 也可以修复。可以通过将 Raj' 后面的查询全部注释掉来修复。所以有效的查询会是这样的

SELECT * FROM table_name WHERE username='Raj'


这条查询语法正确

Q:如何将剩余的查询注释掉?

A:这取决于后端的数据库类型。一般情况下使用 -+ 或者 # 。如果输入用户名 Raj'-+ ,完整的后端查询看起来是这样的

SELECT * FROM  table_name WHERE username='Raj'-+' AND password='Chandel';

但是数据库只会读取并执行这条查询

SELECT * FROM  table_name WHERE username='Raj'

-+ 后面的所有东西都被注释掉了,不会翻译为这条查询的一部分。这就是SQL注入。使用恶意的输入改变后端查询。

我不知道你是否对此怀有疑问,反正我当时学习的时候,有这样一个疑问:

根据上面的带有注释的查询,我们不需要一个有效的密码就可以登录了吗?

是的,如果开发者没有采取防范SQL注入的措施,并且以上面方式实现查询,那么只有用户名就可能成功登录。

感到很疑惑?别急。接下来的文章我会向你展示具体过程。

本文由 看雪翻译小组 hesir 编译,来源 Hacking Articles@Raj Chandel


明日续更~

如果你喜欢的话,不要忘记点个赞哦!


热门阅读文章:



更多优秀文章,长按下方二维码,“关注看雪学院公众号”查看!

看雪论坛:http://bbs.pediy.com/

微信公众号 ID:ikanxue

微博:看雪安全

投稿、合作:www.kanxue.com

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存