赞
踩
目录
结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。
SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。
即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询
在学习sql注入前,我们需要了解sql语句的基本语法 ——>mysql基础学习
我们都知道web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源,即然有资源,那么就需要有存储资源的地方——如mysql数据库。那服务器如何对数据获取了?就需要使用SQL语句这一语法结构进行查询获取。SQL语句通过特有的语法对数据进行查询
我们可以举一个例子,以sqli-labs第一关为例,按要求在url后面加上id=1,显示如下
当我们改变id的值为2是,页面发生了改变。说明它将我们输入的数据代入到了数据中进行查询,页面根据输入数据的不同展示的内容也不同。
ps:url中代表传值的意思,id代表变量,后面的"="代表变量的值
为了更清楚的看清sql语句的执行与变化过程,我们先修改源代码,打开Less-1/index.php,在源码中添加如下语句将执行的sql语句打印出来,方便我们查看
echo '执行的sql语句为:'.$sql;
echo '<br/>';
echo '<br/>';
访问页面如下,打印出了执行的sql语句
在1后面加上单引号, id=1’,页面显示有语法错误,说靠近 ‘1’’ limit 0,1有语法错误,我们输入的数据 1’ 被完整的带入到了SQL语句中,即直接与原有的sql语句进行了拼接。然后执行的sql语句变成了
$sql=“SELECT * FROM users WHERE id=’ 1 ’ ’ LIMIT 0,1”;
我们输入的那个单引号和前面的单引号产生了闭合,导致原有后面的那个单引号变成了多余,而sql语法中引号是必须成对出现的否则就会报错。
既然输入的单引号成了多余也就证明程序没有对我们的输入进行过滤,那我们就构造语句将单引号进行闭合就好了。我们在1后面加上单引号,与前面的引号构成闭合,再接着在后面插入我们自己想要查询的语句就可以查询我们想要查询的数据,就这样被脱库的风险就悄悄的发生。
SQL注入漏洞对于数据安全的影响:
解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。通常修复使用的方案有:
代码层面:
没有进行PDO预处理的SQL,在输入SQL语句进行执行的时候,web服务器自己拼凑SQL的时候有可能会把危险的SQL语句拼凑进去。但如果进行了PDO预处理的SQL,会让MYSQL自己进行拼凑,就算夹带了危险的SQL语句,也不会进行处理只会当成参数传进去,而不是以拼接进SQL语句传进去,从而防止了SQL注入
网络层面:
1. 注入可能存在的地方
竟然是sql注入,那么这个地方肯定是与数据库有数据交互的,所以我们可以优先观察那种页面存在传值或者查询的地方。比如url中的GET型传参,如id=1
如我们看见这种就可以考虑
或者是搜索框,前端将用户输入的数据代入到数据库中进行查询,这种以POST方法进行发送数据。如下这种地方
或者是HTTP请求头部字段如Cookie值,下面会讲到。
2. 漏洞探测
此时需要我们用burp截取查询的数据包,找到传参的变量然后在其后面加上单引号、双引号等如下payload进行测试
#判断如下闭合方式是否会报错,会报错则肯定存在注入
=test'
=test"
#若不报错则判断是否存在布尔盲注,如果页面会有不同的显示在可能存在漏洞
=test" and -1=-1 or '
=test" and -1=-2 or '
=test" and -1=-1 or "
=test" and -1=-2 or "
ps:目前网站的sql注入基本都能通过漏洞扫描器xray检测出来 ——> xray与burp联动,但是这样动静太大(公网上),如果在内网中可以直接挂上xray进行检测。所以在公网时可以手动检测是否存在漏洞,然后在存在漏洞的地方打上*,接着复制整个请求包在txt文档中用sqlmap -r进行注入 ——>sqlmap -r
补充:
get型
1. 进行url编码
在url中进行测试payload需要先进行url编码
不进行编码的话,也可以用+代替空格,#代替–+ 。%23代表#,也是注释符
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。