SQL注入原理及代码分析是怎样的

SQL注入原理及代码分析是怎样的

SQL注入原理及代码分析是怎样的

这篇文章给大家介绍SQL注入原理及代码分析是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

前言

我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在,SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了。而且知识点比较多,所以在这里总结一下。通过构造有缺陷的代码,来理解常见的几种SQL注入。下面只是讲解几种注入原理,没有详细的利用过程。

SQL注入原理

SQL注入漏洞的产生需要满足两个条件

参数用户可控:前端传给后端的参数内容是用户可以控制的。

参数带入数据库查询:传入的参数拼接到SQL语句并带入数据库查询。

所以在实际环境中开发者要秉持“外部参数皆不可信原则”进行开发。

几种常见的SQL注入攻击

union注入攻击

先看代码

<?php
$con=mysqli_connect("localhost","root","XFAICL1314","dvwa"); #连接数据库,我这里直接连接了dvwa的数据库
if(mysqli_connect_error())
{
    echo "连接失败:" .mysqli_connect_error();
}
$id=$_GET['id'];
$result=mysqli_query($con,"select * from users where `user_id`=".$id);
$row=mysqli_fetch_array($result);
echo $row['user'] . ":" . $row['password'];
echo "
"; ?>

在union注入页面中,程序获取GET参数id,对用户传过来的id值没有进行过滤,直接拼接到SQL语句中,在数据库中查询id对应的内容sql注入原理,并将这一条查询结果中的user和 输出到页面。进行union注入攻击前提是页面有回显。

然后就是注入的常规思路,判断类型,判断字段数,使用union查询相关数据。

布尔盲注攻击

先看代码


在布尔盲注页面中,程序先获取GET参数id,通过()函数判断其中是否存在union sleep 等危险字符。然后将参数id拼接到SQL语句,从数据库查询SQL注入原理及代码分析是怎样的,如果有结果,返回yes,否则返回no。所以访问这个页面,代码根据查询结果返回只返回yes和no,不返回数据库中的任何结果,所以上一种的union注入在这里行不通。尝试利用布尔盲注。

布尔盲注是指构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断是成立的。例如,我们可以判断数据库名的长度构造语句如下。

and (())>=1 #依次增加,查看返回结果

通过上面的语句我们可以猜到数据库名长度为4。

接着使用逐字符判断的方式获取数据库库名,数据库库名范围一般都是a~z,字母0~9。构造语句如下。

and ((),1,1)=要猜解的字母(转换成16进制)

是截取的意思,构造语句的含义是,截取()的值,从第一个开始,每次返回一个。这里要注意SQL注入原理及代码分析是怎样的,要和limit语句区分开,limit从0开始排序,从1开始排序。因为我知道数据库的第一个字母是d,所以直接换成d,转换成16进制就是0x64。结果如下。

在真实环境中,自己手工的话,工作量有点大,可以借助burp的爆破功能爆破要猜解的字母。

同样,也可以利用()来猜解表名和字段。构造语句

and (( from . where =库名 limit 0,1),1,1)=要猜解的字母(这里指表名)

用这样的方法,可以猜解出所有的表名和字段,手工会累死,可以借助burp或者。

爆错注入攻击

先看代码


查看代码,在报错注入页面中,程序获取GET参数id后,将id拼接到SQL语句中查询,如果执行成功,就输出ok,如果出错,就通过echo ($con)将错误信息输出到页面。我们可以利用这种错误回显,通过()、floor()等函数将我们要查询的内容显示到页面上。

例如,我们通过()获取user()的值,构造如下语句。

and (1,(0x7e,( user()),0x7e),1) #0x7e是~16进制编码

发现查询出了user()的值

同样,我们也可以查询出()的值

and (1,(0x7e,( ()),0x7e),1) #0x7e是~16进制编码

查询出了数据库名

我们可以用这种方法查询出剩下的所有表名和字段,只需要构造相关的SQL语句就可以了。

时间盲注攻

先看代码

<?php
$con=mysqli_connect("localhost","root","XFAICL1314","dvwa");
if (mysqli_connect_error())
{
    echo "连接失败:".mysqli_error();
}
$id=$_GET['id'];
if (preg_match("/union/i",$id)){
    exit("no");
}
$result=mysqli_query($con,"select * from users where `user_id`=".$id);
$row=mysqli_fetch_array($result);
if ($row){
    exit("yes");
}
else{
    exit("no");
}
?>

查看代码,在时间盲注页面中,程序获取GET参数id,通过()函数判断是否存在union危险字符sql注入原理,然后将id拼接到SQL语句中,并带入数据库查询。如果有结果返回yes,没有结果返回no。不返回数据库中的任何数据。

它与布尔盲注的不同在于,时间盲注是利用sleep()或()等函数让执行时间变长。一般和if(expr1,expr2,expr3)结合使用,这里的if语句的含义为如果expr1为真,则if()返回expr2,否则返回expr3。所以判断数据库的长度,咱们构造的语句如下

if ((())>3,sleep(5),1) #判断数据库长度,如果大于3,休眠5秒,否则查询1

由上面图片,我们通过时间可以判断出,数据库的长度为4。

得到长度后sql注入原理,通过()来查询数据库的第一个字母,这里和布尔盲注很类似,构造如下语句。

and if (((),1,1)=库的第一个字母,sleep(5),1)

依次进行猜解。依次类推,可以猜解出数据库完整的库名,表名,字段名和具体数据。手工的话依旧是一个浩大的工程,一般借助工具。

今天对union注入、布尔盲注、报错注入、时间盲注的原理和代码进行了简单的分析。

关于SQL注入原理及代码分析是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » SQL注入原理及代码分析是怎样的

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们