SQL注入原理及代码分析(一) |
您所在的位置:网站首页 › HTML的代码分析怎么写 › SQL注入原理及代码分析(一) |
前言
我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了。而且知识点比较多,所以在这里总结一下。通过构造有缺陷的代码,来理解常见的几种SQL注入。本文只是讲解几种注入原理,没有详细的利用过程。 如果想要了解Access的详细手工注入过程,可以看我的这篇文章https://www.cnblogs.com/lxfweb/p/12643011.html 如果想要了解MySQL的详细手工注入过程,可以看我的这篇文章https://www.cnblogs.com/lxfweb/p/12655316.html 如果想要了解SQL server的详细手工注入过程,可以看我的这篇文章https://www.cnblogs.com/lxfweb/p/12675023.html SQL注入原理SQL注入漏洞的产生需要满足两个条件 参数用户可控:前端传给后端的参数内容是用户可以控制的。 参数带入数据库查询:传入的参数拼接到SQL语句并带入数据库查询。 所以在实际环境中开发者要秉持“外部参数皆不可信原则”进行开发。 几种常见的SQL注入攻击 union注入攻击先看代码 在union注入页面中,程序获取GET参数id,对用户传过来的id值没有进行过滤,直接拼接到SQL语句中,在数据库中查询id对应的内容,并将这一条查询结果中的user和password 输出到页面。进行union注入攻击前提是页面有回显。 然后就是注入的常规思路,判断类型,判断字段数,使用union查询相关数据。 布尔盲注攻击先看代码 在布尔盲注页面中,程序先获取GET参数id,通过preg_match()函数判断其中是否存在union sleep benchmark等危险字符。然后将参数id拼接到SQL语句,从数据库查询,如果有结果,返回yes,否则返回no。所以访问这个页面,代码根据查询结果返回只返回yes和no,不返回数据库中的任何结果,所以上一种的union注入在这里行不通。尝试利用布尔盲注。
布尔盲注是指构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断是成立的。例如,我们可以判断数据库名的长度构造语句如下。
and length(database())>=1 #依次增加,查看返回结果
先看代码 查看代码,在报错注入页面中,程序获取GET参数id后,将id拼接到SQL语句中查询,如果执行成功,就输出ok,如果出错,就通过echo mysqli_error($con)将错误信息输出到页面。我们可以利用这种错误回显,通过updatexml()、floor()等函数将我们要查询的内容显示到页面上。
例如,我们通过updatexml()获取user()的值,构造如下语句。
and updatexml(1,concat(0x7e,(select user()),0x7e),1) #0x7e是~16进制编码
发现查询出了user()的值
先看代码 查看代码,在时间盲注页面中,程序获取GET参数id,通过preg_match()函数判断是否存在union危险字符,然后将id拼接到SQL语句中,并带入数据库查询。如果有结果返回yes,没有结果返回no。不返回数据库中的任何数据。
它与布尔盲注的不同在于,时间盲注是利用sleep()或benchmark()等函数让执行时间变长。一般和if(expr1,expr2,expr3)结合使用,这里的if语句的含义为如果expr1为真,则if()返回expr2,否则返回expr3。所以判断数据库的长度,咱们构造的语句如下
if (length(database())>3,sleep(5),1) #判断数据库长度,如果大于3,休眠5秒,否则查询1
今天对union注入、布尔盲注、报错注入、时间盲注的原理和代码进行了简单的分析。在第二篇文章中,会对堆叠注入、二次注入、宽字节注入、cookie注入等进行简单的分析。 参考文献:Web安全攻防 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |