sql注入原理(POST)
0x00:sql注入原理SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,
而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行
攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数
据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。
前者由不安全的数据库配置或数据库平台的漏洞所致;
后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。
基于此,SQL注入的产生原因通常表现在以下几方面:
①不当的类型处理;
②不安全的数据库配置;
③不合理的查询集处理;
④不当的错误处理;
⑤转义字符处理不合适;
⑥多个提交处理不当。
0x01:sql注入形成的过程
随着我国从互联网时代,到现在的物联网时代,计算机行业飞速发展,这方面的
人才需求也逐年增多,由于程序员水平层次不齐,没有安全意识,以及快速迭代导致
了,代码质量不高,给攻击者提供了便利,导致这样那样的安全事件层出不穷。
先介绍一种架构B/S如下图所示:
image.png
以Java为例简单的实现以下:
表现层
<form action="/superzedlv/login" method="post">
用户名:<input name="name" size="20" type="text"><br><br>
密码:<inputname="pass"size="20"type="password"><br><br>
<input type="submit" value="登录">
</form>
应用层
//从前端获取表单中的数据
String name1=req.getParameter("name");
//拼接sql语句
String sql="select * from user where user='"+name1+"'";
数据层
执行sql语句查询数据
select * from user where user=name;
0x02:利用漏洞
首先我们确认漏洞,以上述为例我们传入的name拼接的时候变成了
select * from user where user=‘name’;
可以看到我们传入的数据被当做一个条件的值
那么如果我们传入的条件是admin’ and 1=1 #那么会发生什么呢
select * from user where user=‘admin’ and 1=1 #’
#直接将后面的内容注释掉不执行
结果是返回正确的,如果and后面的条件为假时返回错误
那么说明我们后面的条件语句是执行的,也就意味着我们可以通过
浏览器直接执行我们想要执行的sql语句(访问数据层),不需要任何权限。
同样我们也可以通过这样admin' and 1='1语句绕过‘’
select * from user where user=‘admin’ and 1=‘1’
其实我们的目的就是构造可以执行的sql语句,获取信息
下面我们就可以通过sql 语句获取其他信息了
我们可以想一下我还有一个管理员表admin,存放着管理员信息
那么我们就可以构造语句
select * from user where user=‘name’ union select * from admin;
直接查询管理员信息。
0x03:安全防护
1)使用占位符
2)对sql语句进行过滤
3)不使用sql拼接的方式构造sql语句
4)对参数类型进行限制
原文地址:http://www.superzedlv.cn/?id=5
未经允许,禁止转载
Re: sql注入原理(POST)
非常感谢楼主的详细讲解,从原理到实际利用再到防御措施都梳理得很清楚,对新手理解SQL注入非常有帮助。特别是用Java示例展示字符串拼接导致的注入点,以及用注释符#绕过的方式,很直观。想请教一下,在实际渗透测试中,如果遇到类似POST注入但输入被过滤了单引号的情况,除了宽字节注入或者使用反斜杠转义绕过,还有哪些常见的绕过思路?期待楼主或其他大佬补充~Re: sql注入原理(POST)
很清晰的讲解,从原理到实际利用再到防护建议都覆盖了。用登录表单的例子演示POST注入非常直观,新手也能看懂。感谢分享,期待更多技术干货!Re: sql注入原理(POST)
感谢楼主的详细讲解,从原理到实际利用再到防护措施,条理很清晰。特别是用B/S架构和Java示例来演示SQL拼接的过程,让新手能直观理解注入是怎么发生的。另外,你提到的几种防护手段也很实用,尤其是使用预编译占位符,这基本能从根上避免拼接带来的风险。 有一点想请教:你在示例里用了MySQL的 `#` 作为注释符,但在实际渗透测试中,不同的数据库(如Oracle、SQL Server)注释符和语法可能不一样,有没有考虑过针对不同数据库做适配的方法?或者常见的一些绕过技巧(比如对单引号的过滤)?如果后续能补充这方面的内容,应该会更有实战价值。 总之,很受益,期待更多安全相关的分享!
页:
[1]