sql注入风险,你有吗?

溢+项目提测后,QA反馈的安全报告里出现了sql盲注风险和sql注入漏洞。
经分析,溢+调用支付中心,而支付中心的DAL用ADO.NET实现,在对请求数据进行持久化时,当时的工程师是这么拼的insert语句:

string GetInsertSqlStr(PayApplyDTO entity)
{
    string format = @"
INSERT dbo.T_PayApply
( systemId ,
    businessCode ,
    platform ,
    plattype ,
    paySource ,
    bankCode ,
    payMoney ,
    backAddress ,
    returnUrl ,
    .....
)
VALUES  ( {0} , -- systemId - int
    {1} , -- businessCode - int
    {2} , -- platform - int
    {3} , -- plattype - int
    '{4}' , -- paySource - varchar(50)
    '{5}' , -- bankCode - varchar(50)
    {6} , -- payMoney - decimal
    '{7}' , -- backAddress - varchar(500)
    '{8}' , -- returnUrl - varchar(500)
    .....
)";
    string insertSql = string.Format(format,
        (int)entity.BusinessSystemId, (int)entity.BusinessCode, (int)entity.ThirdPayPlatform, (int)entity.PayType,
        entity.PaySource, entity.BankCode, entity.PayMoney,
        entity.BackAddress, entity.ReturnUrl,
        ...
        );
    return insertSql;
}

很显然,当字符串参数里包含'时,而程序未对其转义,就会报SQLException。这个漏洞显然必须要补掉,要不然我们的系统太low了。

修复后的版本:

把上面的是string类型的属性做下处理,将'转义为'':

string insertSql = string.Format(format,
    (int)entity.BusinessSystemId, (int)entity.BusinessCode, (int)entity.ThirdPayPlatform, (int)entity.PayType,
    entity.PaySource, entity.BankCode.Replace("'","''"), entity.PayMoney,
    entity.BackAddress.Replace("'", "''"), entity.ReturnUrl.Replace("'", "''"),
    ...
    );
return insertSql;

上面的修复未免草率,这不,禁不起测试,运行单元测试时用例抛出了System.NullReferenceException。 最后,还是改成用传递SqlParamters参数的形式来持久化吧。

public static int Add(PayApplyDTO entity)
{
    string cmdText = @"
INSERT dbo.T_PayApply
( systemId ,
    businessCode ,
    platform ,
    plattype ,
    paySource ,
    bankCode ,
    payMoney ,
    backAddress ,
    returnUrl ,
    ...
)
VALUES  ( @systemId ,
    @businessCode , 
    @platform , 
    @plattype , 
    @paySource , 
    @bankCode , 
    @payMoney , 
    @backAddress ,
    @returnUrl ,
    ... 
)";

    List<SqlParameter> paramList = new List<SqlParameter>()
{
    new SqlParameter("@systemId",entity.BusinessSystemId),//enum本身是int值,所以不需要.GetHashCode()了
    new SqlParameter("@businessCode",entity.BusinessCode),
    new SqlParameter("@platform",entity.ThirdPayPlatform),
    new SqlParameter("@plattype",entity.PayType),
    new SqlParameter("@paySource",entity.PaySource),
    new SqlParameter("@bankCode",entity.BankCode??""),
    new SqlParameter("@payMoney",entity.PayMoney),
    new SqlParameter("@backAddress", entity.BackAddress??""),
    new SqlParameter("@returnUrl",entity.ReturnUrl??""),
    ...
};
    int i = SqlHelper.ExecuteNonQuery(
        ConfigFile.PayCenterConnection,
        System.Data.CommandType.Text,
        cmdText,
        paramList.ToArray());
    return i;
}

【结语】真是不测不知道呀! 上面的拼接sql还会带来很多风险:

  1. 可能会查看、修改或删除数据库条目和表;
  2. 可能会窃取诸如用户名和密码等未经加密即发送了的用户登录信息

大家一定要抛弃这种拼接sql的方式。

【附】非常专业的安全扫描报告截图:

1.png
2.png
3.png
4.png
sql盲注.png
sql注入.png
发现数据库错误模式.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注入攻击的分类 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传...
    查无此人asdasd阅读 1,683评论 0 5
  • Web安全简史 在Web1.0时代,人们更多是关注服务器端动态脚本语言的安全问题,比如将一个可执行脚本(俗称Web...
    潘良虎阅读 3,959评论 3 72
  • SQL注入 概念 危害 原理 实例 防御 基础 - ### SQL语句所用符号不同数据库的sql注入与提权常见S...
    yddchsc君阅读 1,370评论 1 10
  • 一周转眼结束,迎来轻松的周末。这样的舒适值得喜悦:但回想起生命中的432000s 与自己擦肩而过又觉得彷徨。...
    桃味小盐巴阅读 190评论 0 0
  • 由吃鸡引发的对于宇宙黑暗森林法则的思考 吃鸡的地图就是一个宇宙,里面有戴着三级甲十五倍镜的高等文明,也有赤身裸体一...
    喻逸风阅读 525评论 1 0