黑客恶意注入SQL命令,是开发的大意还是测试的疏忽?
获奖详情:http://bbs.chinaunix.net/thread-4203429-1-1.html近日中信证券山东站点发现被黑客通过SQL注入的方式渗透到内网,最终导致大量客户信息泄露。因为系统存在漏洞才会让黑客利用应用程序,将恶意的SQL命令注入到后台数据引擎执行,从而获取非法数据和权限。中信证券大量客户信息被泄露,纠结谁该背锅?是开发的大意还是测试的疏忽?在信息安全尤为重要的今天,我们将如何保证我们的软件不存在SQL非法注入?
1. SQL非法注入危害有哪些?
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
3. 如何在开发环节避免SQL注入,你用过哪些方法?
4. 在测试过程中,你用过哪些方法来检测SQL注入?
讨论时间:2015年10月19日—2015年11月19日
奖品设置:
活动结束后,我们将选取4名讨论精彩的同学送《Oracle 12c PL/SQL程序设计终极指南》。
出版社: 机械工业出版社
ISBN:9787111503286
版次:1
商品编码:11712238
包装:平装
丛书名: 数据库技术丛书
开本:16开
出版时间:2015-06-01
用纸:胶版纸
页数:705
内容简介:全书按照PL/SQL程序设计的实际需要进行组织,分基础篇、开发篇、高级篇三篇。基础篇介绍了PL/SQL程序设计的基础知识,包括基本语法、控制结构、游标、异常处理等;开发篇介绍了PL/SQL程序最实用的开发技术,包括子程序、包、触发器、动态SQL、批绑定、子程序依赖性等;高级篇介绍了Oracle对象、LOB大对象、作业调度管理、性能优化以及PL/SQL内置包等高级特性。
试读样章:
1. SQL非法注入危害有哪些?
> 数据泄露
> 数据删除
> 数据篡改
等等
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
这个检索是指注入获取?
打开浏览器-->打开网站-->按F12--->点击按钮--->查看发送请求--->猜测业务模型--->构造SQl
比如这个请求:url?uid=1
篡改为: url?uid=1'or1=1
如果存在漏洞,则可能将该表中所有用户的数据列出来。
至于更新改变也是类似操作
3. 如何在开发环节避免SQL注入,你用过哪些方法?
在java开发中,不使用拼SQl的方式,使用预处理语句可避免,现在的ORM框架也都能预防SQL注入,就怕开发人员不按规矩来
4. 在测试过程中,你用过哪些方法来检测SQL注入?
这个不清楚,没做过这种测试。
很多测试人员也不会测
这个应该属于安全测试类别,只有这类的测试人员估计才能做。
开发的话,都是通过代码审核来发现可能潜在的问题 本帖最后由 jieforest 于 2015-10-19 18:49 编辑
真恐怖,关注。
1. SQL非法注入危害有哪些?
危害很多。
1)获取部分或整个数据库的数据
2)删除或修改现有的数据库
3)破坏网站的运营
4)曝光数据
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
检索数据肯定是SELECT语句嘛。
要实现SQL注入,比如可以这样输入
and 1=(SELECT IS_SRVROLEMEMBER(sysadmin));--
又比如
union select 1 from information_schema.tables
3. 如何在开发环节避免SQL注入,你用过哪些方法?
1)对用户提交的输入信息进行验证,确保内容的合法。
在客户端,可以通过网页上的JS,对内容进行过滤,让提交的内容合法。
在服务器端,同样需要检查用户输入的内容,再次验证。
2)将用户的敏感信息进行加密处理
将用户提交的敏感信息如密码等,先加密处理,再与数据库的内容进行比对,由于密文是无特殊意义的,也就失去了攻击的可能。
3)编写存储过程来执行所有的查询
可以防止攻击者利用单引号和连字符实施攻击。
4. 在测试过程中,你用过哪些方法来检测SQL注入?
1)使用专业的漏洞扫描工具
有这些:SQL Power Injector、SQLIer、SQLMap、SQLNinja、SQLID、Pangolin、BSQL Hacker、The Mole、Havij、Enema SQLi、sqlsus、Safe3 SQL Injector、SQL Poizon等。
其中,BSQL Hacker和Enema SQLi用得较多。
好活动,好书,支持.......... 1. SQL非法注入危害有哪些?
可以获取网站数据,还可以生成网站后门,后门程序可以得到用户的权限,包括对数据库的增删查改,甚至文件的修改,因为mysql 支持select into outfile的写入文件的功能。
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
sql注入的手法非常灵活,通过sql语句的select 后面加and,or等子句,如
猜表名:And (Select count(*) from 表名)<>0
获得数据库连接用户名:;and user>0
绕过后台:select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a';
等等,
3. 如何在开发环节避免SQL注入,你用过哪些方法?
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中,可以使用参数化的语句,尽量不要拼接SQL语句
4. 在测试过程中,你用过哪些方法来检测SQL注入?
可以手工检测,也可以利用工具进行检测 国产码农技术真他娘的菜回复 1# 第一最寂寞i
友情支持,对于这方面没有涉及啊
:lol 本帖最后由 lsstarboy 于 2015-10-24 10:31 编辑
1. SQL非法注入危害有哪些?
sql注入是危害比较大的一种手段,也是非常常见,并且黑客最常用的一种。获取用户信息是小事,有些大点的漏洞会有数据库的写权限。
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
sql注入一般靠特殊字符来拼接,将正常的查询截断,变正带有攻击性的查询语句。
3. 如何在开发环节避免SQL注入,你用过哪些方法?
php的话,最好使用pdo来进行查询、更新等工作,有了prepare的步骤,可以防止大多数的sql注入,因为pdo查询、更新等使用的是占位符,后面到来的真实数据不会插入到sql语句中,从根本上提高了防御注入的能力。
(1)如上所述,使用pdo,会使注入风险大幅度下降;
(2)对所有REQUEST进行过滤,但这会影响性能,小系统可以使用;
(3)不允许模块、用户程序直接操作REQUEST(包括GET、POST、UPDATE等),而使用专门过滤过的接口来处理,这样不是太影响性能;
(4)在获取用户数据的时候,必须进行严格过滤,白名单制更安全一些,比如姓名字段,就只能使用2-5个汉字。
程序在获取所有数据时,不能直接操作,而必须指定类型,比如:password,xm(姓名),interger,email,phone-number等,这样基本上可以杜绝注入。
(5)sql注入最常用的几个字符:单引号、双引号、重音符号等,一定要过滤、过滤再过滤;另外还要注意%2F的形式,有时系统会自动转为特殊符号。
4. 在测试过程中,你用过哪些方法来检测SQL注入?
sqlmap比较好用,另外安全工作,kali是不二之选。 1. SQL非法注入危害有哪些?
轻着访问到了不该访问的数据.重者可以直接拿到数据库权限.这个在mysql,mssql上是有案例的,特别是早期的mssql.
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
sql注入,可以分为单行注入,和多行注入.单行注入,就是这个注入漏洞智能执行一条sql语句,这种构造起sql比较累,需要对sql比较了解才行.
多行注入,就是这个注入语句可以执行多条sql,这个好办很多.一般的sql都是以`;`结束,拼接多条就好了.伪代码可以是: origin select sql; new update select sql; origin select sql;
3. 如何在开发环节避免SQL注入,你用过哪些方法?
用一些表映射代码库操作,这种库一般有做非法字符检查.url参数检查,过滤非法字符.sql尽量不用用拼接模式,如果用拼接模式,拼接完之后,做sql检查.sql操作一般都提供预处理模式,可以避免很多sql注入.能用非字符串的,尽量不要用字符串.
sql错误不抛出到页面,可以记录到数据库.这样就算有sql注入,因为没有信息输出,就很难界定注入点了.
4. 在测试过程中,你用过哪些方法来检测SQL注入?
url参数后面加上`;`,` --`, ` and 1=1 `, `#`等字符来做简单判断
1. SQL非法注入危害有哪些?
SQL注入漏洞的危害不仅体现在数据库层面,还有可能危及承载数据库的操作系统;
如果SQL注入被用来挂马,还可能用来传播恶意软件等,这些危害主要包括:
数据库信息泄漏:数据库中存储的用户隐私信息泄露。
网页篡改:通过操作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
服务器被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
破坏硬盘数据,瘫痪全系统。
2. 如何检索我们需要的数据?如何通过SQL注入更新和改变数据库中的数据?
利用SQL注入获取数据库数据,其方法可以大致分为联合查询、报错、布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的。当发现了一个基于insert、update、delete语句的注射点时(比如有的网站会记录用户浏览记录,包括referer、client_ip、user-agent等,还有类似于用户注册、密码修改、信息删除等功能),还可以用如上方法获取我们需要的数据。
3. 如何在开发环节避免SQL注入,你用过哪些方法?
主要方法有:
1.过滤URL中的一些特殊字符,动态SQL语句使用PrepareStatement..
2.注入的方式就是在查询条件里加入SQL字符串. 可以检查一下提交的查询参数里是否包含SQL,但通常这样无益.
最好的办法是不要用拼接SQL字符串,可以用prepareStatement,参数用set方法进行填装
3.sql注入形式:...where name="+name+",这样的sql语句很容易sql注入,可以这样:
jdbcTemplate.update("delete from userinfo where id=? and userId=?", new Object[]{userInfo.getId(),userInfo.getUserId()});
4.Sql注入漏洞攻击:如1'or'1'='1
使用参数化查询避免
cmd.CommandText="select count(*) from 表名 where username=@a and password=@b";
cmd.parameters.Add(new SqlParameter("a",".."));
cmd.parameters.Add(new SqlParameter("b",".."));
5. 前端的一些设置:
(1:向 CA 购买证书,使用 HTTPS 进行通信,以保证在网络传输过程中是安全的
(2:避免 XSS 注入(页面回显的 input text, input hidden 均过滤 <、>、"、' 等字符等)
(3:使用随机键盘或者安全控件防止键盘木马记录用户的输入
(4:若要在 Cookie 中写入数据,尽量使用 Cookie 的 HttpOnly 属性
(5:响应中设置一些诸如 X-Frame-Options、X-XSS-Protection 等高版本浏览器支持的 HTTP 头
(6: 不管客户端是否做过数据校验,在服务端必须要有数据校验(长度、格式、是否必填等等)
(7: SQL 语句采用 PreparedStatement 的填充参数方式,严禁使用字符串拼接 SQL 或者 HQL 语句
4. 在测试过程中,你用过哪些方法来检测SQL注入?
以检测文本型的注入漏洞方法为例:
现在假设有一个新闻页面,URL 是 localhost/news.asp?id=123,
1. 在浏览器中打开,可以看到一个正常的新闻页面;
2. 在URL地址后面加上-1,URL变成: localhost/news.asp?id=123-1,如果返回的页面和前面不同
,是另一则新闻,则表示有注入漏洞,是数字型的注入漏洞;在 URL地址后面加上 -0,URL变成
localhost/news.asp?id=123-0,返回的页面和前面的页面相同,加上-1,返回错误页面,则也表
示存在注入漏洞,是数字型的。
否则:
3. 在URL的地址后面加上'%2B',URL地址变为: localhost/news.asp?id=123'%2B',返回的页面和
1同;加上'2%2B'asdf,URL地址变为: localhost/news.asp?id=123'%2Basdf,返回的页面和1不同
,或者说未发现该条记录,或者错误,则表示存在注入点,是文本型的。
为什么这样可以呢?
我们可以从程序的角度来考虑一下。程序员的这条语句大致应该是这样的:
select * from news where id=123
当我们在后面加上 -1 后,语句变为
select * from news where id=123-1
SQL服务器在执行这条语句时会进行运算,实际执行的是:
select * from news where id=122
这样选出来的就是另外一条新闻记录了。如果该记录存在,就是另一则新闻;否则会显示记录不存在,或者出错
。呵呵。 这也同时表示程序未对输入的数据进行过滤,存在数值型的注入漏洞。
如果 SQL 语句时这样的:
select * from news where id='123'
那么我们在后面加上 '%2B' 之后,语句变为
select * from news where id='123'+''
%2B 是 + 的URL编码。 这样之后,SQL服务器实际执行的是:
select * from news where id='123'
会返回同样的页面。
加上 '%2B'asdf 之后,语句变为
select * from news where id='123'+'asdf'
实际执行的是:
select * from news where id='123asdf'
返回页面不存在,或者显错。
页:
[1]
2