SQL注入详解(一)

前言:
SQL注入漏洞从1998年圣诞节大火以来,长盛不衰,虽然开发人员想出各种方法对它进行围追堵截,却始终不能赶尽杀绝。这一系列的文章会从最基本的东西开始,为大家剖析SQL注入,从动态网站架构开始,借助源代码,讲解注入原理。逐步讲解各种数据库的注入语句(包括access,mysql,sqlserver,oracle,postgresql),再到各种注入技巧(HTTP头注入,伪静态注入,Base64注入,偏移注入(包括多级偏移注入),盲注,注入中转等等),再差一足不同的类型注入(cookie注入,POST注入),最后介绍各种注入工具的使用(SQLMAP,穿山甲,胡萝卜)最后的最后说一下注入的挖掘(注意,这是一个很长的故事,主要是笔者在学习过程当中作为总结,复习用途。所以内容也是多方参考,如果侵犯到您的权益,请联系我进行删除。PS:何处是参考内容我会标注)

0x1动静态网站架构(注入产生的条件)
说到注入,就难以避免一个问题:“任何网站都存在注入吗?”答案是否定的,我们都知道,静态网站是不存在注入的,那么,为什么呢?我们不妨从动静态网站的架构来分析一下。

下图是笔者鼠绘的两张架构图。

SQL注入详解(一)_第1张图片
Paste_Image.png
SQL注入详解(一)_第2张图片
Paste_Image.png

不难看出,当用户浏览静态网站和动态网站时,静态网站背后的故事要简单很多,而我们的SQL注入,就产生在用户发送http请求这一过程当中,该http请求中包含了恶意语句,服务器却将它编译执行,web服务器再将它交给数据库处理,结果就非常糟糕了。好好品味一下这一过程,就出现了SQL注入产生的条件。

1、必须是动态网站
2、执行的语句必须是可控的

下面,我们借助代码做一个更加深入的分析。
下面是一个php脚本文件的源代码:
$con =mysql_connect('127.0.0.1','root','root');//连接数据库
$id = GET_['id'];
mysql_select_db('数据库名',$con);//mysq_select_db函数指定查询的数据库
$sql = "select * from 表名 where id=$id";//用一个变量来存放查询的SQL语句。
echo mysql_result(mysql_query($sql),0,'username');

从攻击者的角度来看,发生了下面几件事,通过url(也就是发送http请求)为变量id以get方式传入参数值,拼接SQL语句,代入数据库执行。如果攻击者传入恶意的语句,那么很不幸,直接带入数据库执行了,it’s
terrible!
这一节我们介绍了注入攻击发生的过程,相信大家也想明白了,注入语句本质上就是数据库语句,所以,我们下面依次说明不同数据库的注入方式。

你可能感兴趣的:(SQL注入详解(一))