1、SQL注入的原理
应用程序在向后台数据库传递SQL查询时,如果为攻击者提供了该查询的能力,就会引发SQL注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和功能,并且影响SQL所支持数据库和操作系统的功能和灵活性。
2、web通用的架构
数据库驱动的Web应用通常包括三层:
表示层(html等)
逻辑层(.net、jsp、php等)
存储层(数据库)
3、SQL注入的过程
(1)寻找注入点
利用工具进行大量测试
(2)网站所处的服务器环境
常见搭配:
Asp+access、php+mysql、jsp+sqlserver
(3)判断注入点是否可以注入
and 1=1 and1=2
(4)如果可以注入,则进行sql注入攻击,获取管理员信息。上传木马,拿到权限
4、五大绕过方式
(1)转义字符处理不当
SQL数据库将单引号字符解析成代码与数据的分割线,单引号外面均是需要运行的代码,单引号里的是数据。有时只需要在url后面输入单引号就可以快速识别出这个web站点是否存在sql注入攻击。
//构造动态SQL语句
$SQL="SELECT* FROM table WHERE field='$_GET["input"]'";
//执行SQL语句
$result=mysql_query($SQL);
(2)类型处理不当
//构造动态SQL语句
$SQL="SELECT* FROM table WHERE field=$_GET["userid"]";
用户输入的直接传递给动态创建的SQL语句,接受一个数字参数,返回信息
//执行SQL语句
$result=mysql_query
mysql数据库内置命令——读取系统上的一个文件
1 Union all select load_file('/etc/passwd')
SELECT* FROM TABLE WHERE userid=1union all select load_file('/etc/passwd')
(3)查询语句的组装不当
当我们使用动态SQL语句进行编码,当编程的时候还不知道有哪些表或者所要查询的表或字段不存在(大型数据库交互时)
//构造动态SQL语句
$SQL="SELECT".$_GET["column1"].","GET["column2"]."FROM".$_GET[table];
//执行SQL语句
$result=mysql_query($SQL);
操控HTTP请求,将user作为表名,user、password作为列名
User.php?table=user&column1=user&column2=password
(4)错误处理不当
有时候将详细的错误信息带给攻击者,而攻击者通过利用这些错误信息来进一步达到渗透测试的目的
//构造动态SQL语句
$getid="SELECT first_name,last_name FROM users WHERE user_id='$id'";
//执行SQL语句
$result=mysql_query($getid) or die('<pre>'.mysql_error().'</pre>');
(5)多个提交处理不当
//处理表单1
If($_GET[form1]="form1"{
//参数是否是一个字符串
If(is_string($_GET["param"])){
//获取字符串的长度并检查是否在指定范围内
If(strlen($_GET["param"])<$max){
//将字符串传递给一个外部校验函数
$bool=validata(input_string,$GET["param"]);
if($bool=true){}}}}
//处理表单2
if($_GET["form2"]="form2"){
//由于第一个表单已经验证过参数,因此这里无须验证
$SQL="SELECT* FROM TABLE WHERE ID=$_GET["param"]";
//执行SQL查询语句
$result=mysql_query($SQL);
}
可以直接调用第二个表单提交数据
PROBLEM
1、如果web站点禁止输入单引号字符,是否可以避免SQL注入?
不能,首先可以使用很多方式对单引号编码;有些SQL注入不需要使用该字符,还可以使用其他字符,如双竖线(||)和双引号(")等
2、任何编程语言只要在将输入传递给动态创建的SQL语句之前未经验证,就容易受到潜在的攻击,除非使用参数化查询和绑定变量。
5、寻找SQL注入的方法
(1)通过GET请求
(2)通过post请求
(3)其他http请求数据