国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > WEB安全实战(一)SQL盲注

WEB安全实战(一)SQL盲注

来源:程序员人生   发布时间:2014-11-11 08:24:48 阅读次数:3027次

前言


好长时间没有写过东西了,不是不想写,只不过是1直静不下心来写点东西。固然,拖了这么长的时间,也总该写点甚么的。最近刚刚上手安全方面的东西,作为1个菜鸟,也本着学习的目的,就谈谈最近接触到的安全方面的问题吧。


背景


既然提到了背景,那我们就简单的带1下,最近http://www.wfuyu.com/Internet/上爆出了各种惊人的事件、各种门、各种照的,归根结柢,都是网络安全出的问题,有的是网络被他人监控了,广大大众的生活工作都处在人家的眼皮底下,1举1动都逃不出人家的“法眼”;还有的是1些商家的http://www.wfuyu.com/server/被黑,用户名、密码被盗,信誉卡被盗刷,私人文件泄漏等等。这些都是安全出了问题。固然,强如苹果那样的大公司,都会出现这样的事件,更别说普普统统的小公司了。


问题


SQL盲注,这个词我想大家应当不怎样陌生。如果说实在不知道的话,那末“SQL注入”你1定听说过。这两个词似乎有甚么联系,长的跟双胞胎似的?没错,SQL盲注是1种Web系统的安全漏洞,而且是比较严重的那种,它是SQL注入的其中1种方式。也就是说,SQL注入存在很多种方式,而SQL盲注就是其中的1种。

在安全级别中,SQL盲注是1种要挟程度很高的安全漏洞,通过这类方式,可以入侵服务提供商的http://www.wfuyu.com/server/http://www.wfuyu.com/db/,从而盗取、篡改、乃至是删除用户数据。固然,在正常情况下,这些都是不允许产生的,在系统上线之前,这些都是经过严格检测的,而且http://www.wfuyu.com/db/中的数据也都是不定向的加密,不会暴露用户数据的。


技术描写


采取IBM的AppScan,对系统进行测试,由于在初期的开发中,采取了很多不规范的代码,因此,这次的测试可谓是“大丰收”,网站安全方面的漏洞暴露无疑,而在安全测试报告中,最严重的漏洞就非SQL盲注莫属了。



解决方案


SQL盲注的危害大家也都清楚了,那末该如何避免这类情况的产生呢?说简单点,就是对要求进行过滤,对参数进行验证,对非法字符进行拦截替换,清算用户输入的危险字符,保证sql能够在http://www.wfuyu.com/db/中正确的编译和履行。这就是解决的简单思路。不过,今天我想要说的不是这些,而是在伟人的肩膀上发现问题,解决问题。

MyBatis,1款相当好用的持久化框架,有了它以后,我们省下了很多的时间、很多的重复性工作。同时,也要意想到,在框架的应用中,也是存在1些安全问题的,固然,框架中有的已给出了很好的解决方案,但有的还是需要我们自己去解决。比如这个SQL盲注的问题,MyBatis就给出了很好的解决方案,在mapper.xml文件中使用#{name}的方式提供占位符,使得sql在http://www.wfuyu.com/db/中编译的时候,将这些占位符替换成用户输入的正确的参数值,这样就避免了1部份的问题。

代码以下

<span style="font-family:Comic Sans MS;font-size:12px;"><?xml version="1.0" encoding="UTF⑻"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis⑶-mapper.dtd"> <mapper namespace="com.test.dao.TAcntMapper"> <resultMap id="BaseResultMap" type="com.test.entity.TAcnt"> <id column="SYS_ID" jdbcType="DECIMAL" property="sysId" /> <result column="OBJ_ID" jdbcType="VARCHAR" property="objId" /> <result column="OBJ_NAME" jdbcType="VARCHAR" property="objName" /> <result column="OBJ_DESCRIPTION" jdbcType="VARCHAR" property="objDescription" /> <result column="CREATOR" jdbcType="VARCHAR" property="creator" /> <result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime" /> <result column="UPDATE_OPERATOR" jdbcType="VARCHAR" property="updateOperator" /> <result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime" /> <result column="CLIENT_CHK_FLAG" jdbcType="DECIMAL" property="clientChkFlag" /> <result column="CELL_PHONE" jdbcType="VARCHAR" property="cellPhone" /> <result column="REG_EMAIL" jdbcType="VARCHAR" property="regEmail" /> <result column="GENDER" jdbcType="DECIMAL" property="gender" /> <result column="QQ_NO" jdbcType="VARCHAR" property="qqNo" /> <result column="WEB_URL" jdbcType="VARCHAR" property="webUrl" /> </resultMap> <sql id="Example_Where_Clause"> <where> <foreach collection="oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Update_By_Example_Where_Clause"> <where> <foreach collection="example.oredCriteria" item="criteria" separator="or"> <if test="criteria.valid"> <trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="criteria.criteria" item="criterion"> <choose> <when test="criterion.noValue"> and ${criterion.condition} </when> <when test="criterion.singleValue"> and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue"> and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue"> and ${criterion.condition} <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Base_Column_List"> SYS_ID , OBJ_ID , OBJ_NAME , OBJ_DESCRIPTION , CREATOR , CREATE_TIME , UPDATE_OPERATOR , UPDATE_TIME , CLIENT_CHK_FLAG , CELL_PHONE , REG_EMAIL , GENDER , QQ_NO , WEB_URL </sql> <sql id="From_join"> from T_ACNT </sql> <select id="selectByExample" parameterType="com.test.entity.TAcntCriteria" resultMap="BaseResultMap"> select <if test="distinct"> distinct </if> <include refid="Base_Column_List" /> <include refid="From_join" /> <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> <if test="orderByClause != null"> order by ${orderByClause} </if> </select> <select id="selectByPrimaryKey" parameterType="BigDecimal" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> <include refid="From_join" /> where SYS_ID = #{sysId,jdbcType=DECIMAL} </select> <delete id="deleteByExample" parameterType="com.test.entity.TAcntCriteria"> delete from T_ACNT <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> </delete> <insert id="insert" parameterType="com.test.entity.TAcnt"> insert into T_ACNT ( OBJ_ID , OBJ_NAME , OBJ_DESCRIPTION , CREATOR , CREATE_TIME , UPDATE_OPERATOR , UPDATE_TIME , CLIENT_CHK_FLAG , CELL_PHONE , REG_EMAIL , GENDER , QQ_NO , WEB_URL ) values ( #{objId,jdbcType=VARCHAR} , #{objName,jdbcType=VARCHAR} , #{objDescription,jdbcType=VARCHAR} , #{creator,jdbcType=VARCHAR} , #{createTime,jdbcType=TIMESTAMP} , #{updateOperator,jdbcType=VARCHAR} , #{updateTime,jdbcType=TIMESTAMP} , #{clientChkFlag,jdbcType=DECIMAL} , #{cellPhone,jdbcType=VARCHAR} , #{regEmail,jdbcType=VARCHAR} , #{gender,jdbcType=DECIMAL} , #{qqNo,jdbcType=VARCHAR} , #{webUrl,jdbcType=VARCHAR} ) </insert> <select id="countByExample" parameterType="com.test.entity.TAcntCriteria" resultType="java.lang.Integer"> select count(*) <include refid="From_join" /> <if test="_parameter != null"> <include refid="Example_Where_Clause" /> </if> </select> <update id="updateByExample" parameterType="map"> update T_ACNT set OBJ_ID = #{record.objId,jdbcType=VARCHAR} , OBJ_NAME = #{record.objName,jdbcType=VARCHAR} , OBJ_DESCRIPTION = #{record.objDescription,jdbcType=VARCHAR} , CREATOR = #{record.creator,jdbcType=VARCHAR} , CREATE_TIME = #{record.createTime,jdbcType=TIMESTAMP} , UPDATE_OPERATOR = #{record.updateOperator,jdbcType=VARCHAR} , UPDATE_TIME = #{record.updateTime,jdbcType=TIMESTAMP} , CLIENT_CHK_FLAG = #{record.clientChkFlag,jdbcType=DECIMAL} , CELL_PHONE = #{record.cellPhone,jdbcType=VARCHAR} , REG_EMAIL = #{record.regEmail,jdbcType=VARCHAR} , GENDER = #{record.gender,jdbcType=DECIMAL} , QQ_NO = #{record.qqNo,jdbcType=VARCHAR} , WEB_URL = #{record.webUrl,jdbcType=VARCHAR} <if test="_parameter != null"> <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByPrimaryKeySelective" parameterType="com.test.entity.TAcnt"> update T_ACNT <set> <if test="objId != null"> OBJ_ID = #{objId,jdbcType=VARCHAR}, </if> <if test="objName != null"> OBJ_NAME = #{objName,jdbcType=VARCHAR}, </if> <if test="objDescription != null"> OBJ_DESCRIPTION = #{objDescription,jdbcType=VARCHAR}, </if> <if test="creator != null"> CREATOR = #{creator,jdbcType=VARCHAR}, </if> <if test="createTime != null"> CREATE_TIME = #{createTime,jdbcType=TIMESTAMP}, </if> <if test="updateOperator != null"> UPDATE_OPERATOR = #{updateOperator,jdbcType=VARCHAR}, </if> <if test="updateTime != null"> UPDATE_TIME = #{updateTime,jdbcType=TIMESTAMP}, </if> <if test="clientChkFlag != null"> CLIENT_CHK_FLAG = #{clientChkFlag,jdbcType=DECIMAL}, </if> <if test="cellPhone != null"> CELL_PHONE = #{cellPhone,jdbcType=VARCHAR}, </if> <if test="regEmail != null"> REG_EMAIL = #{regEmail,jdbcType=VARCHAR}, </if> <if test="gender != null"> GENDER = #{gender,jdbcType=DECIMAL}, </if> <if test="qqNo != null"> QQ_NO = #{qqNo,jdbcType=VARCHAR}, </if> <if test="webUrl != null"> WEB_URL = #{webUrl,jdbcType=VARCHAR}, </if> </set> where SYS_ID = #{sysId,jdbcType=DECIMAL} </update> </mapper></span>

固然,这仅仅是第1步,如果你想写出1个完全避免SQL盲注的系统。那末还是需要对用户发出的要求进行过滤,而且还要包括要求中的参数值,很有可能包括1些危险字符,这些危险字符就是我们需要过滤并处理的问题所在。关于解决危险字符这1块,我留到后面细说,由于这触及到很多个漏洞,包括:XSS,CSRF等等。


结束语


俗语说,安全猛于虎!安全无小事!在http://www.wfuyu.com/Internet/上,这些也是1样的。刚开始接触安全的我,也许说是,刚开始深入研究安全的我,正在汲取这方面的营养,通过测试出来的安全漏洞,1点1点的解决潜伏的危机。这还仅仅是个开始,后续的日子里还有很长的路要走,大家1起加油吧。固然,如果有甚么新的感受,我也会写出来跟大家1起分享,1起进步。


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生