热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP代码审计:SQL注入漏洞

原文链接:https://blog.csdn.net/God_XiangYu/article/details/97898230
原文链接:https://blog.csdn.net/God_XiangYu/article/details/97898230




当你的才华

还撑不起你的野心时

那你就应该静下心来学习


      代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。

目录

SQL注入漏洞审计

一、宽字节注入

宽字节注入原理

宽字节注入实例

宽字节注入防御


SQL注入漏洞审计

简介:

       SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 SQL注入的产生,是因为代码或者编码的不完善。代码的不完善往往是因为程序编写过程中没有考虑到代码的健壮性及安全性。而编码的不完善问题,只要通过规范使用几种函数就可以有效避免。介于代码和编码是两种不同层面的问题,我们将SQL注入也分为两大类:

  • 普通SQL注入:最为常见的sql注入,由于未对用户输入进行过滤或过滤不严而产生的漏洞,分为整数型和字符型注入,通常直接通过union联合查询就可以进行数据库查询。


  • 编码SQL注入:为了防御SQL注入,某些应用会对用户输入进行编码,但编码处理的函数本身也存在一些问题,导致可以通过输入一些编码函数不兼容的特殊字符,将输出字符变为危险数据,最常见的就是Mysql宽字节注入。


 

      我们这里主要对宽字节注入进入叙述,后面再补充普通SQL注入的了解,如需要学习SQL注入方面知识

     请前往下面链接:

                  https://blog.csdn.net/god_xiangyu/article/category/9106861

一、宽字节注入


宽字节注入原理

虽然现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,实现统一的国际规范,但仍然有很多网站仍然使用着自己国家的一套编码(比如gbk),作为自己默认的编码类型。 为了防御普通的Sql注入,有些网站会开启magic_quotes_gpc或者使用addslashes、mysql_real_escape_string等函数对用户输入进行过滤时,这时候输入参数中存在的单引号,就会被强制添加\(转义符)而转移转义。这种方式确实可以一定程度上的防御 Sql注入,但是如果数据库恰好使用的是 GB2312、GBK、GB18030 等宽字节的编码,就会造成宽字节注入。

 

宽字节注入实例

实例:

代码如下:

  1. # 打开非持久的 MySQL 连接
  2. $cOnn=mysql_connect('localhost','root','');
  3. # 函数设置活动的 MySQL 数据库。
  4. # 如果成功,则该函数返回 true。如果失败,则返回 false
  5. # 设置连接数据库,且指定数据默认数据库
  6. mysql_select_db("CA_sql",$conn);
  7. # mysqli_query() 函数执行某个针对数据库的查询
  8. mysql_query("SET NAMES 'GBK'",$conn);
  9. # addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
  10. $uid = addslashes($_GET['id']);
  11. $sql = "SELECT * FROM books where tid='$uid'";
  12. # mysqli_query() 函数执行某个针对数据库的查询
  13. $result = mysql_query($sql,$conn);
  14. print_r('SQL:'.$sql.'
    ');
  15. # mysql_fetch_row() 函数从结果集中取得一行作为数字数组
  16. print_r(mysql_fetch_row($result));
  17. # mysql_close() 函数关闭非持久的 MySQL 连接
  18. mysql_close();
  19. ?>

登录访问宽字节注入实例页面成功

PHP代码审计:SQL注入漏洞 - 文章图片

输入?id=1回显正常:

PHP代码审计:SQL注入漏洞 - 文章图片

输入 ?id=1'也没有报错,可以看到是因为对'做了转义,变成了': 

PHP代码审计:SQL注入漏洞 - 文章图片

输入id=-1' union select database(),user(),version()%23是没法成功注入的,因为单引号闭合后union后面的语句不会执行。(使用-1而不是1是因为有时候sql查询回显是有长度限制的,使用-1查不到任何数据,才能回显union后面的查询结果):

PHP代码审计:SQL注入漏洞 - 文章图片

我们知道mysql会将\编码为%5c,所以我们考虑能否在前面再加上%df,组合成了%df%5c,这不就恰好对应编码中的字吗?答案是可以的!宽字节中两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,使用这种方法成功绕过转义,就是所谓的宽字节注入。

[注释]:<其实不光可以用%df,只要第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以:> 输入id=-1%df' union select database(),user(),version()%23(%23对应#):如上图,查询成功

PHP代码审计:SQL注入漏洞 - 文章图片

如上图,查询成功

宽字节注入防御

对于宽字节注入,有如下几种防御方式:

  • 使用mysql_set_charset函数设置连接所使用的字符集,再调用mysql_real_escape_string来过滤用户输入。


  • 将character_set_client设置为binary(二进制)


  • 使用参数化查询、pdo查询



我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


&#160;



推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
lovejiao2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有