渗透攻防Web篇-SQL注入攻击初级

来源;http://bbs.ichunqiu.com/thread-9518-1-1.html?from=ch

作者:zusheng

时间:2016年8月3日 12:11:50

社区:i春秋

前言

不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问,我们真的了解SQL注入吗?看完本篇文章希望能让你更加深刻的认识SQL注入。

目录

第一节 注入攻击原理及自己编写注入点

1.1、什么是SQL?

1.2、什么是SQL注入?

1.3、SQL注入是怎么样产生的?

1.4、编写注入点

第二节 寻找及确认SQL注入

2.1、推理测试法

2.2、and大法和or大法

2.3、加法和减法

正文

第一节 注入攻击原理及自己编写注入点

1.1、什么是SQL?

SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。

1.2、什么是SQL注入?

看起来很复杂,其实很简单就能解释,SQL注入就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。

1.3、SQL注入是怎么样产生的?

构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造SQL语句。开发人员可以使用动态SQL来创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准来决定提取什么字段(如SELECT语句),或者根据不同的条件来选择不同的查询表时,动态构造SQL语句会非常有用。

在PHP中动态构造SQL语句字符串:

[PHP]纯文本查看复制代码

?

1

$query="SELECT * FROM users WHERE username = ".$_GET["ichunqiu"];

看上面代码我们可以控制输入参数ichunqiu,修改所要执行SQL语句,达到攻击的目的。

1.4、编写注入点

为了照顾一下新人,这里先介绍一下涉及到的基础知识:

[SQL]纯文本查看复制代码

?

1

2

3SQLSELECT语法

SELECT列名称FROM表名称

符号 * 取代列的名称是选取所有列

[SQL]纯文本查看复制代码

?

1

2

3

4WHERE子句

如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。

语法

SELECT列名称FROM表名称WHERE列 运算符 值

下面的运算符可在 WHERE 子句中使用:

了解了以上基础知识就让我们来自己编写注入点把。

第一步:我们使用if语句来先判断一下变量是否初始化

[PHP]纯文本查看复制代码

?

1

2

3

4

5

if(isset($_GET["ichunqiu"])){

}

?>

第二步:在if语句里面,我们连接数据库。在PHP中,这个任务通过 mysql_connect() 函数完成。

[PHP]纯文本查看复制代码

?

1

2

3

4mysql_connect(servername,username,password);

servername        可选。规定要连接的服务器。默认是"localhost:3306"。

username        可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。

password        可选。规定登录所用的密码。默认是""。

第三步:连接成功后,我们需要选择一个数据库。

[PHP]纯文本查看复制代码

?

1

2

3mysql_select_db(database,connection)

database        必需。规定要选择的数据库。

connection        可选。规定 MySQL 连接。如果未指定,则使用上一个连接。

第四步:选择完数据库,我们需要执行一条 MySQL 查询。

[PHP]纯文本查看复制代码

?

1

2

3mysql_query(query,connection)

query        必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。

connection        可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。

第五步:执行完查询,我们再对结果进行处理

[AppleScript]纯文本查看复制代码

?

1

2

3

4

5

6

7mysql_fetch_array(data,array_type)

data可选。规定要使用的数据指针。该数据指针是 mysql_query()函数产生的结果。

array_type

可选。规定返回哪种结果。可能的值:

MYSQL_ASSOC-关联数组

MYSQL_NUM-数字数组

MYSQL_BOTH-默认。同时产生关联和数字数组

题外话:我们使用echo将执行的SQL语句输出,方便我们查看后台执行了什么语句。

[PHP]纯文本查看复制代码

?

1

echo$querry

最终代码如下:

[PHP]纯文本查看复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26if(isset($_GET["id"])){

$con= mysql_connect("127.0.0.1:3306","root","root");

if(!$con)

{

die('Could not connect: '. mysql_error());

}

mysql_select_db("ichunqiu",$con);

$querry="select * from users where id = ".$_GET['id'];

$sql= mysql_query($querry,$con);

$result= mysql_fetch_array($sql);

echo"";

id

username

echo"";

".$result['id']."

".$result['username']."

echo"";

echo"";

mysql_close($con);

echo$querry;

}

?>

MySQL数据库实验环境配置:

代码层工作已经做好,但是在数据库里面,我们还没有ichunqiu这个数据库啊,接下来我就带大家一步步创建数据库,创建表,创建列,插入数据。

第一步:创建数据库

第二步:创建表users和列id,username,password

第三步:我们插入几条数据

同样的道理,大家多插几条数据。到此我们整个任务就完成了。

最终成果如下:

第二节 寻找及确认SQL注入

2.1、推理测试法

寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。

首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个:

GET请求:该请求在URL中发送参数。

POST请求:数据被包含在请求体中。

其他注入型数据:HTTP请求的其他内容也可能会触发SQL注入漏洞。

了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以MySQL为例,其它的请大家自行学习咯。

我们现在参数后面加个单引号,如下图:

sql语句最终变为

[SQL]纯文本查看复制代码

?

1

select*fromuserswhereid = 1'

执行失败,所以mysql_query()函数会返回一个布尔值,在下行代码中mysql_fetch_array($sql)将执行失败,并且PHP会显示一条警告信息,告诉我们mysql_fetch_array()的第一个参数必须是个资源,而代码在实际运行中,给出的参数值却是一个布尔值。

我们修改代码在

[PHP]纯文本查看复制代码

?

1

2$sql= mysql_query($querry,$con);下一行加上

var_dump($sql);

可以发现:

为了更好的了解MySQL错误,我们在

[PHP]纯文本查看复制代码

?

1

$sql= mysql_query($querry,$con);

加上

[PHP]纯文本查看复制代码

?

1

2

3

4if(!$sql)

{

die('

error:'.mysql_error().'

');

}

这样当应用捕获到数据库错误且SQL查询失败时,就会返回错误信息:(我们在参数中添加单引号返回的错误信息)

[SQL]纯文本查看复制代码

?

1

error:You have an errorinyour SQL syntax;checkthe manual that correspondstoyour MySQL server versionfortherightsyntaxtouse near'''atline 1

然后借助这些错误,我们这可以推断应该存在SQL注入。还有其他数据库错误信息,以及MySQL其他错误信息,由于篇幅问题就不一一讲解了。

2.2、and大法和or大法

页面不返回任何错误信息,我们就可以借助本方法来推断了,首先我们在参数后面加上 and 1=1和and 1=2看看有什么不同

可以发现and 1=1 返回了数据,而and 1=2没有,这是由于1=1是一个为真的条件,前面的结果是true,true and true 所以没有任何问题,第二个 1=2 是个假条件, true and false还是false,所以并没有数据返回。

好,讲完and,我们自来看看 or ,or就是或者,两个都为假,才会为假。我们先把id改为5,可以发现id=5是没有数据的。

可以发现我们加上or 1=1就成功返回了数据,这是因为1=1为真,不管前面是不是假,数据都会返回,这样就把表里面数据全部返回,我们没看见,是因为代码中并没有迭代输出。这样,我们来修改一下代码。

[PHP]纯文本查看复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12echo"";

id

username

echo"";

//遍历查询结果

while($result= mysql_fetch_array($sql)) {

".$result[0] ."

".$result[1] ."

echo"";

}

然后你就可以发现:

2.3、加法和减法

这里我们需要区分一下数字型和字符串型:

数字型:不需要使用单引号来表示

其他类型:使用单引号来表示

综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。

加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。

减法是同样的道理,不过我们不需要对-号进行url编码了。

结束语

感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正,谢谢。

系列文章预告及导航

渗透攻防Web篇-SQL注入攻击中级(状态:更新中)

第三节 利用SQL注入

第四节 SQL盲注利用

渗透攻防Web篇-SQL注入攻击高级(状态:更新中)

第五节 避开过滤方法总结

第六节 探讨SQL注入防御技巧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容