• SQL注入漏洞代码分析


    1.代码分析

    HTML代码

    1. <form action="#" method="GET">
    2. <input type="text" name="id">
    3. <input type="submit" name="Submit" value="Submit">
    4. </form>
    5. action=“#”,将数据提交到当前页面。

    PHP代码分析

    1. if(isset($_GET[‘Submit’])){ //判断Submit变量是否存在
    2. $id = $_GET[‘id’]; //获取id变量的值并赋值给变量$id
    3. $getid = "SELECT first_name, last_name FROM users WHERE user_id = ‘1’ and ‘1’=‘1'";
    4. //select查询语句赋值给变量$getid
    1. $result = mysql_query($getid) or die('
      ' . mysql_error() . '
      '
      );
    2. //mysql_query()函数执行mysql查询
    3. //die() 函数输出一条消息,并退出当前脚本。
    4. //mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息。
    5. //or之前的语句执行不成功时,才会执行后面的语句。
    6. //and之前的语句执行成功时,才会执行后面的语句。

    mysql_query()函数

    1. mysql_query()如果是执行查询之类的语句(select),那么会返回一个资源标识符,也就是我们要查找的数据结果集;
    2. mysql_query()如果是执行增删改之类的语句,返回的就是true或者false了。

    PHP代码分析

    1. $num = mysql_numrows($result); //返回结果集中行的数目
    2. $i = 0;
    3. while ($i < $num) {
    4. $first = mysql_result($result,$i,"first_name"); //返回结果集中first_name字段的值
    5. $last = mysql_result($result,$i,"last_name"); //返回结果集中last_name字段的值
    6. echo '
      '; 
    7. echo 'ID: ' . $id . '
      First name: '
      . $first . '
      surname: '
      . $last;
    8. echo '
    ';
  • $i++;
  • }
  • 2.漏洞分析

    SQL注入分类

    按照所传递的数据类型分类: 数字型注入 SELECT first_name, last_name FROM users WHERE user_id= id字符型注入SELECTfirstn​ame,lastn​ameFROMusersWHEREuseri​d=′id‘ 无论何种类型,都可以通过直接输入单引号来判断是否存在注入点。 可以分别输入3和1+2,根据显示结果来判断数据类型。

    字符型注入

    字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。

    1. SELECT first_name, last_name FROM users WHERE user_id =1or 1=1 or'
    1. or 1=1 or ‘ 假 oror
    2. 1or1=1or
    3. or 1=1 # 假 or
    4. or 1=1 -- 假 or

    手工MySQL注入流程

    1. ’ union select 1,2 #
    2. ’ union select user(),database() #
    3. ‘ union select table_name,2 from information_schema.tables where table_schema='dvwa' #
    4. ‘ union select column_name,2 from information_schema.columns where table_name='users' #
    5. ‘ union select user,password from users #

    3.漏洞防御

    如何防御SQL注入

    SQL注入漏洞的形成原因:用户构造的语句被代入到数据库中执行。

    防御SQL注入的首要原则:用户的一切输入都是有害的,或是说不被信任的。

    防御SQL注入的主要方法:对用户输入的数据进行过滤。

    medium级别的防御措施

    1. $id = $_GET['id'];
    2. $id = mysql_real_escape_string($id);
    3. 使用mysql_real_escape_string()函数对用户输入的id参数进行了过滤。
    4. 可以将单引号【'】、双引号【"】、反斜杠【\】、空字符【null】等进行转义。
    5. 转义是把指定的字符转换成无意义的符号,比如PHP解析器不会把经过转义的引号当成引号来看待。
    6. PHP中另一个功能类似的函数:addslashes()

    medium级别的漏洞

    1. $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";
    2. 注入类型变成了数字型,mysql_real_escape_string()函数过滤无效。

    high级别的防御措施

    1. $id = $_GET['id'];
    2. $id = stripslashes($id);
    3. $id = mysql_real_escape_string($id);
    4. stripslashes()函数的作用是删除由 addslashes() 函数添加的反斜杠,也就是去除addslashes()函数的转义。

    magic_quotes_gpc魔术引号

    在PHP配置文件php.ini中存在magic_quotes_gpc选项,被称为魔术引号。

    在high级别下,PHP的magic_quotes_gpc被自动设为on。

    开启之后,可以对所有的GET、POST和COOKIE传值的数据自动运行addslashes()函数

    关闭魔术引号

    修改C:\Windows\php.ini文件magic_quotes_gpc = Off

    重启Apache服务

    high级别的防御措施

    1. if (is_numeric($id)){
    2. $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
    3. 在执行查询之前,使用了if语句进行判断,判断的条件是is_numeric()函数。
    4. 判断用户输入的数据是否是数字型,只要不是数字型就一概报错。
    5. andorselect等语句都无法执行。

    如何从代码层面防范SQL注入

    对于数字型注入,可以使用if语句,并以is_number()函数作为判断条件进行防御。

    对于字符型注入,对用于接收用户参数的变量,用mysql_real_escape_string()、addslashes()等函数进行过滤。

    SQL注入的防范措施

    代码层面 1.对输入进行严格的转义和过滤; 2.使用参数化查询。

    网络层面 1.通过WAF进行防护; 2.云端防护:安全狗、360网站卫士、阿里云盾等。

  • 相关阅读:
    springboot 等待批量异步任务完成
    微信小程序——简易复制文本
    【数据分享】2021年全国区县点位数据
    小白学编程(CSS):跳动的文字
    3D 生成重建007-Fantasia3D和Magic3d两阶段玩转文生3D
    MySQL与Oracle数据库通过系统命令导出导入
    【软考】__集成_考前20问
    laravel框架介绍(一) 开发环境配置
    基于包围盒的机械臂防碰撞算法matlab仿真
    PyQt5快速开发与实战 3.2 布局管理入门 and 3.3 Qt Designer实战应用
  • 原文地址:https://blog.csdn.net/m0_74025111/article/details/138128587