sql注入例子,假设DB中存在如下数据:
+----+---------+----------+
| id | uid | password |
+----+---------+----------+
| 1 | forrest | abc |
| 3 | denny | abc |
| 5 | peggy | abc |
| 6 | vivian | abc |
+----+---------+----------+
正常Query语句:SELECT * FROM user WHERE uid='vivian' AND password='abc';
用户名框注入:'123' OR '1'='1',密码框输入:'abc' --> sql语句变为:SELECT * FROM user WHERE (uid='123' OR '1'='1') AND (password='abc');
可查询到所有密码为abc的用户,并登陆成功。
密码框注入:'123' OR '1'='1',用户名框输入:'vivian' --> sql语句变为:SELECT * FROM user WHERE (uid='vivian' AND password='123') OR ('1'='1');
可查询到所有用户,并登陆成功。
用户名框注入:'123' OR '1'='1',密码框注入:'123' OR '1'='1' --> sql语句变为:SELECT * FROM user WHERE [(uid='123' OR '1'='1') AND password='123'] OR '1'='1';
可查询到所有用户,并登陆成功(可以看出结果和只在密码框中注入sql的结果是一样的)。
上面中的()[]是为了给sql断句,以便理解(这样就应该很好理解了吧,一个很简单的逻辑哦,我就不解释了)。实际应用中并无此类括号。
ps:如果知道了DB中某Table的tablename。则可以对其进行破坏,eg密码框注入:'123'; drop table tb_name; --> 真的很发指啊!!!
1、PreparedStatement
可对sql预编译. 你传入的任何内容就不会和原来的语句发生任何匹配的关系(前提是数据库本身支持预编译,但目前流行数据库都支持预编译了)
2、表单验证(正则表达式)对数据进行过滤(屏蔽掉注入关键词)
3、正则表达式检测已经形成的sql语句(在sql被execute前进行)
2.1、检测SQL meta-characters的正则表达式 /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
2.2、修正检测SQL meta-characters的正则表达式 /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/i
2.3、典型的SQL注入攻击的正则表达式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
2.4、检测SQL注入,UNION查询关键字的正则表达式 /((\%27)|(\'))union/ix(\%27)|(\') - 单引号和它的hex等值union - union关键字。
2.5、检测MS SQL Server SQL注入攻击的正则表达式 /exec(\s|\+)+(s|x)p\w+/ix
4、Filter过滤
public static String filterContent(String content){
String flt ="'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String filter[] = flt.split("|");
for(int i=0;i<filter.length ; i++){
content.replace(filter[i], "");
}
return content;
}
5、 避免动态SQL
动态SQL是动态查询的很好的工具,但这也会暴露脆弱点。很多情况下可以使用其他SQL语句或存储过程来代替动态SQL。当然,如果您在存储过程中依然通过用户输入来建立动态SQL查询,那么只靠替换还是不安全的。
6、最低权限原则
永远也不要在代码中用管理员级别权限的帐户来连接数据库。应用程序使用的帐户应该只拥有应用程序需要的最低级别的权限。这也能将已入侵者造成的破坏降低到最低限度。应用程序不能已sa或其他管理员帐号连接数据库,而且应定义使用的帐号能访问的范围。
7. 安全存储机密信息
不要用明文存储机密信息。较好的替代方法是使用加密或散列密码。散列密码较加密密码更安全,这是因为它们不能被解密。你还可以在散列加密之前添加一些随机值来增加安全性。
8. 只有知道如何注入,才能更有效的防注。一个例子
正常地址:
http://www.xxx.com/news.asp?id=1
加个',如果没过滤特殊字符,网页一定出错,就是看怎么出错法。画面能显示一部分,一部分提示数据库出错,找不到什么什么,最有希望注入。
http://www.xxx.com/news.asp?id=1'
下一步,试试 and 1=1 ,如果画面不出错,1=1是成立的,有希望了。
http://www.xxx.com/news.asp?id=1 and 1=1
下一步,试试 and 1=2 ,如果画面出错,1=2是不成立的,可以肯定这个地址可以注入。
http://www.xxx.com/news.asp?id=1 and 1=2
好戏来了:
http://www.xxx.com/news.asp?id=1 and (select * from admin)>0
不出错,证明数据库有admin这个表。
http://www.xxx.com/news.asp?id=1 and (select username from admin)>0
不出错,证明数据库的admin有username这个字段。
http://www.xxx.com/news.asp?id=1 and len(select top 1 username from admin)>5
不出错,证明数据库的admin的第一个username长度>5。
后面的自己测试……本文的目的仅用于各位站长检测自己的站有没有SQL注入漏洞。
分享到:
相关推荐
SQL 注入基础知识点总结 SQL 注入是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法...
SQL注入是一种常见的网络安全漏洞,发生在应用程序使用用户输入的SQL代码直接构建数据库查询时。当攻击者能够通过输入恶意SQL语句来控制或篡改数据库查询,他们就能获取敏感信息、修改数据甚至完全控制系统。《SQL...
DB2数据库SQL注入手册 DB2数据库SQL注入手册是指在使用DB2数据库时,如何检测和防止SQL注入攻击的一份指南。SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在输入字段中 inject恶意SQL代码来访问或控制...
C#防SQL注入 C#防SQL注入是指在C#程序中防止SQL注入攻击的方法。SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在输入字段中.inject恶意SQL代码,来访问、修改或删除数据库中的数据。为了防止SQL注入,C#...
### SQL注入字典Fuzz详解 #### 一、引言 在网络安全领域,SQL注入攻击是一种常见的威胁方式,它利用数据库应用系统中的漏洞,通过恶意构造的SQL语句来获取敏感数据或对数据库进行非法操作。为了有效地检测和防范...
### SQL注入攻击实验报告知识点详解 #### 一、实验背景及目的 - **实验背景**:随着互联网技术的发展,Web应用程序越来越广泛地应用于各种场景之中。然而,由于开发者对安全性的忽视,使得许多Web应用程序存在安全...
SQL注入是一种常见的网络安全漏洞,主要出现在使用动态SQL语句构建数据库查询的应用程序中。这个"sql注入网站源码"提供了一个具有SQL注入漏洞的ASP(Active Server Pages)网站实例,对于学习如何检测、防范和修复这...
SQL注入是一种常见的网络安全威胁,它利用了Web应用程序中对用户输入数据处理的不足,使得攻击者能够注入恶意的SQL代码,以获取未经授权的数据或者控制数据库服务器。以下是对SQL注入漏洞的全面讲解,包括其原理、...
SQL手工注入大全:包含各种类型的SQL注入,实现手工注入的乐趣,此资源你值得拥有。 此资源包含:宽字节注入、SQL手工注入漏洞测试(Oracle数据库)、SQL手工注入漏洞测试(Sql Server数据库)、SQL手工注入漏洞测试...
【描述】:“SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑” 描述中的重复部分强调了御剑作为SQL注入工具的核心属性。SQL注入是黑客通过构造恶意的SQL语句...
"SQL注入漏洞全接触"知识点总结 一、 SQL注入漏洞的定义和原理 * SQL注入漏洞是指攻击者通过构造特殊的输入,来获取或修改服务器上的敏感数据。 * SQL注入漏洞的原理是从客户端提交特殊的代码,从而收集程序及...
SQL注入是一种严重的安全威胁,它允许攻击者通过在应用程序的输入字段中插入恶意SQL代码来执行未经授权的数据库操作。攻击者通常寻找没有适当验证和过滤的用户输入,然后利用这些漏洞来构造能改变原始SQL语句意图的...
超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入。 超级SQL注入工具目前支持Bool型盲注、错误显示注入、...
### MyBatis如何防止SQL注入 #### SQL注入简介与危害 SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过提交恶意的SQL代码到应用程序的输入字段中(如表单、URL等),利用这些输入来操控数据库执行非预期的...
从标签"防注入"、"最新ASP SQL注入代码"、"最新ASP通用防SQL注入代码"我们可以看出,这个压缩包文件的核心内容是关于防止ASP应用程序遭受SQL注入攻击的代码示例,它适用于各种ASP应用场景。 在压缩包内的文件"通用...
机器学习检测SQL注入# ML-for-SQL-Injection机器学习检测SQL注入本项目是使用机器学习算法来分类SQL注入语句与正常语句:使用了SVM,Adaboost,决策树,随机森林,逻辑斯蒂回归,KNN,贝叶斯等算法分别对SQL注入语句...
SQL注入攻击与防御技术白皮书.pdf 本文档主要介绍了SQL注入攻击的原理、方式、危害及防御措施,旨在帮助读者更好地理解和防御这种常见的数据库漏洞攻击方式。 1.SQL注入攻击简介 SQL注入攻击是一种针对数据库的...
在IT行业中,SQL注入是一种常见的安全威胁,攻击者通过输入恶意的SQL代码来获取、修改、删除数据库中的敏感信息。为了防止这种情况发生,开发者需要在应用程序中实施有效的防御策略,其中一种方法就是使用过滤器...
Java 防止 SQL 注入的几个途径 Java 防止 SQL 注入是一个非常重要的安全问题。SQL 注入攻击是黑客最常用的攻击方式之一,它可以让攻击者访问或修改数据库中的敏感信息。因此,防止 SQL 注入是 Java 开发者必须注意...
sql注入攻击流量情况