引子

事情是这样的,这次小马写了一个关于判断前端传参是否有汉字并对汉字进行校验的功能,代码如下:

又听到很多同学说,要特别注意urldecode的二次解码注入问题。于是搜索了相关资料,大部分说的关于这个urldecode二次解码引发注入的问题是这样的:

因为对于编码的字符串 ,PHP本身在处理提交的数据之前会进行一次urldecode解码(大豆存在于PHP5.3以上),然后一般后端接收到参数,自然而然会再进行一次urldecode函数解码,因为和urlencode()成双成对的嘛。这原本看起来也没什么问题,因为两次urldecode并不会影响结果值。比如urldecode('你好'),得到的还是‘你好’,自然问题不在于这里。

urldecode二次解码有注入风险

问题在于:如果我们构造字符串/getUser.php?id=%2527520%2527,提交后PHP自行解码,%25解码成了%,得到url是/getUser.php?id=%27520%27;注意了,这个时候,我们的urldecode()函数登场了,正儿八经地进行了一次解码,将%27解码成了’,于是最终得到的url是 /test.php?id='520'。原理就是: echo urldecode(urldecode('%2527520%2527')); 得到 '520'。

在后端得到这个url是非常敏感的,因为这很容易让人想到单引号SQL注入。PHP中常用的过滤函数如addslashes()、mysql_real_escape_string()、mysql_escape_string()或者使用魔术引号GPC开关来防止注入,原理都是给单引号(’)、双引号(”)、反斜杠(\)和NULL等特殊字符前面加上反斜杠来进行转义。而这些都容易被urlencode后的字符串绕过。如%2527520%2527很容易被校验和过滤函数直接通过,但其实解码后是含有特殊字符的,这样就容易有SQL注入风险,只要构造playload让id二次解码后等于 '520' or 1=1 就可以注入了。让URL解码后得到?id='520' or 1=1将得到如下语句,获取得到所有用户数据:

select * form user where id='520' or 1=1;

其实没那么可怕

不要慌,其实没那么可怕。这个只是在于参数校验失守,底层DAO又没在最终入库的时候转义特殊字符才有可能发生的。但是这两道防线目前基本很少被攻破,因为主流的框架大多数接收处理后,在入库之前都会进行参数校验和过滤,一般都封装了底层的DAO,在入库之前还有最后一层mysql_real_escape_string()转义特殊字符,如果不去修改底层,一般问题不大。除非自己写的架子,多注意一下就好了。

总结

如何避免这个问题的总结:

从前端接收完提交参数,urldecode完尽量先做参数处理,在参数进入逻辑之前最后进行参数校验和过滤,如开头的代码图,再次校验参数中含有的字符是否符合规范;前面不管如何处理,如何转码,入库之前一定要做最后的转义(转义在最后,不要先转义再urldecode再入库,这样就很危险了)。顺带一提:rawurldecode()也会产生同样的问题,因此在使用这两个函数都需要多注意一下就可以了。

urldecode mysql_urldecode()解码引发注入其实也没那么可怕相关推荐

  1. 安全开发Java:日志注入,并没那么简单

    本文分享自华为云社区<Java云服务开发安全问题解析--日志注入,并没那么简单>,原文作者:breakDraw. 案例故事 某个新系统上线了,小A在其中开发了个简单的登录模块,会在日志里记 ...

  2. linux shell urldecode_shell 下 urlencode/urldecode 编码/解码的几种方法

    1.先弄清楚为什么要 urlencode? http://www.genome.iastate.edu/community/angenmap/URLEncoding.html URL Encoding ...

  3. ios html decode,IOS 中 urldecode 如何解码后,解码后“+”(加号)和空格处理方式

    请求后的结果如下: { "IsSuccess": 1, "ResCode": "1", "ResMsg": " ...

  4. setupdigetclassdevs没找到usb_充电就被植入木马,共享充电宝还没那么可怕

    近日,公安部网安局的官方微信公众号更新了一则题为<警惕身边的共享充电宝陷阱>的内容.在该文中介绍到,现代人一旦手机没了电简直就是丢掉半条魂,这时候如果有个充电宝那就是救命的神器.但上海网警 ...

  5. 看看多线程,其实没那么可怕----小话多线程(1)

    作者:陈曦 日期:2012-8-2 9:55:28 环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2] 转载请注明出处 Q1: 对于主线程, ...

  6. php url编码原理,urlencode编码/urldecode解码作用及使用方法

    urlencode和urldecode释义 urlencode是一个函数,可将字符串以URL编码,用于编码处理. URL编码(URL encoding),也称作百分号编码(Percent-encodi ...

  7. php urledcode_php慎用urldecode函数

    在php中urldecode和urlencode是一对双胞胎,如果在url中包含了中文,urlencode函数属于必用的.为什么呢? 因为中文有很多编码,简体主要有gb2312和utf-8这两种,其中 ...

  8. 【SQL注入技巧拓展】————13、我的WafBypass之道(SQL注入篇)

    0x00 前言 去年到现在就一直有人希望我出一篇关于WAF的文章,我觉得这种老生常 谈的话题也没什么可写的.很多人一遇到waf就发懵,不知如何是好,能搜到的各种姿势也是然并卵.但是积累姿势的过程也是迭 ...

  9. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 6.全局防护盲点的总结上篇

    [PHP代码审计] 那些年我们一起挖掘SQL注入 - 6.全局防护盲点的总结上篇 0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等 ...

最新文章

  1. Open3d学习计划—高级篇 8(网格变形)
  2. Dubbo 和 HSF 在阿里的实践:携手走向下一代云原生微服务
  3. [0] OpenCV_Notes - 琐碎
  4. 如何用点云对车辆和行人进行识别分类?这是MIT学生的总结
  5. 使用Nancy打造TaskManager2.0管理系统
  6. 洛谷P4727:图的同构计数(Polya引理)(dfs)
  7. asc desc排序_21.数据库排序?左连接 ?右连接?
  8. python空条件_python – 如何在SQLAlchemy中指定一个条件,其中一个条件要求列为空?...
  9. 曝华为Mate 50正在测试:有望搭载骁龙898旗舰芯
  10. open cv+C++错误及经验总结(十三)
  11. Merge PDF - Split PDF(PDF合成)
  12. swagger导出excel文档_excel导入导出api
  13. 安卓电子书格式_kindle如何导入电子书
  14. 冯诺依曼与哈佛结构的区别
  15. register hotkey
  16. 激活函数(1)Sigmoid激活函数
  17. 拿什么来保障程序员的工作?
  18. 网狐6603服务器列表加载失败,600 秒后将重新加载, ADO 错误:0x80004005,连接失败
  19. 大学英语四级涉及计算机阅读,大学英语四级阅读部分应试技巧 -电脑资料
  20. CMake 使用方法 http://www.cnblogs.com/lyq105/archive/2010/12/03/1895067.html

热门文章

  1. 存文件的服务器叫什么区别,文件服务器区别
  2. cad线性标注样式修改在哪里_如何设置CAD中线性标注?
  3. deeplab训练自己的数据
  4. C语言的enum枚举类型
  5. 结构专业规范大全_钢结构大全图文详解,手把手教你钢结构识图,反正我收藏了!...
  6. python 3.5 田字格的输出
  7. 同城配送物流3大痛点4大趋势
  8. 金蝶用友2011年度财报对比
  9. 计算机设备管理器没有网络适配器,分享Win10设备管理器没有网络适配器的解决方法...
  10. 带小数十进制转二进制--图解