zoukankan      html  css  js  c++  java
  • 《Web安全攻防 渗透测试实战指南 》 学习笔记 (五)

    Web安全攻防 渗透测试实战指南   学习笔记 (五)

     
     

    第四章 Web安全原理解析  (一)


    (一)SQL注入的原理

      1.web应用程序对用户输入数据的合法性没有判断。

      2.参数用户可控:前端传给后端的参数内容是用户可以控制的。

      3.参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

      举个栗子:

       select * from users where id=1 and 1=1 

      当1=1为真,且where语句中id也为真,页面会返回与id=1相同的结果。

      当传入的id参数为and 1=2时,由于1=2为假,所以页面就会返回与id=1不同的结果。

      (这样就说明,你构造的sql语句是被执行了,由此可以初步判断id参数存在sql注入漏洞~)
      

    (二)Mysql注入

    1.MySQL介绍

      Mysql5.0版本以后,mysql默认在数据库中存放一个“information_schema”的数据库。
      在该库中,读者需要记住三个表名,分别是SCHEMATA、TABLES、COLUMNS。

      SCHEMATA表存储该用户创建的所有数据库的库名,该表中记录数据库库名的字段名为SCHEMA_NAME。

      TABLES表存储该用户创建的所有数据库的库名和表名,该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。

      COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,该表中记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。


    2.Mysql小知识点


      database() : 当前网站使用的数据库
      version():当前mysql的版本
      user():当前mysql的用户

    3.MySQL查询语句

      (1)在不知道任何条件下,你可以试试:

      select 要查询的字段名  from  库名.表名 

      (2)知道一条已知条件时,你可以试试:

      select 要查询的字段名  from  库名.表名 where 已知条件的字段名=‘已知条件的值’

      (多条已知条件的话,使用 and 连接~)

    4.limit用法

      limit子句可以被用于强制 SELECT 语句返回指定的记录数。limit 接受一个或两个数字参数。参数必须是一个整数常量。

      如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: limit # OFFSET #。

      举几个例子~

    mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15   
    //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。

      

    5.注释符
     
      常见注释符表示方法有  #、空格、/**/
     
      内联注释:
      /*!code*/
      举例: index.php?id=-15/*!union*//*!select*/1,2,3 
     
      注:
         必须记住一个库 information_schema
          必须记住三个表 schemata、tables、columns
          schemata表中存储该用户创建的数据库的库名
          tables表中存储该用户创建的库名和表名
          columns表中存储该用户创建的表名和字段名
     
     
     
    (三)Union注入攻击
     
    由于本书的配套连接已经失效~
    等笔者找到合适的环境再来补充实验部分。
     
    1.判断方法
     
    可以通过添加单引号再次访问
    页面返回结果与之前不同
     
    访问id=1 and 1=1   
    由于and 1=1为真,所以页面返回与id=1相同,
    访问id=1 and 1=2
    由于and 1=2为假,所以页面返回与id=1不同。
    因此有可能出现sql注入漏洞。
     
    接着
    使用order by 1-99 语句查询该数据表的字段数量,即可以理解为order by=1-99
    若访问id=1 order by 3,页面返回和id=1相同的结果,访问id=1 order by 4,页面返回和id=1不同的结果,则字段数为3.
     
    在数据库中查询参数id对应的内容,然后将数据库的内容输出到页面。
    这时可以使用union注入,并且通过order by查询结果:
    union select 1,2,3
     
    若只看到页面执行成功,但没有返回union select 的结果,因此获取的结果没有输出到页面
     
    我们可以通过设置参数id值,让服务器返回union select的结果
    例如:把id的值设置为-1,因为数据库没有id=-1的数据,所以会返回union select的结果。
    (这一步没有很懂,大佬们多指教)
     
     
    当设置id=-1,页面返回结果,2:3时,意味union select 1,2,3中,2和3的位置可以输入mysql语句,则可以尝试在2的位置查询当前数据库名(使用 database()  函数),
    访问  id=1 union select 1,database(),3 
    页面返回数据库信息
     
    得知数据库库名后,查询表名
    使用下面语句:
     select table_name from information_schema.tables where table_schema='库名' limit 0,1 
     
    尝试在 id=1 union select 1,2,3中的2处粘贴上述语句
     
    id=-1+union select 1select table_name from information_schema.tables where table_schema='库名' limit 0,13
     
    执行,得到表名
     
    这里查询表名
    命令:
    select column_name from information_schema.columns  where table_schema='库名' and table_name='表名'  limit 0,1
    获取该表的第一个字段名,使用 limit 1,1,获取该表的第二个字段名
     
     
    2.union注入代码分析
     
     

     当访问id=1 union select 1,2,3时,执行的sql语句为:

      select * from users where id=1 union select 123 

     因此,即可获取数据库中的数据~

     
     
     
     

    参考资料:

    《Web安全攻防 渗透测试实战指南》

     
     
  • 相关阅读:
    【笔记】隐式寻址方式(pending...)
    【笔记】有结构文件(pending...)
    【笔记】目录项(pending...)
    【笔记】主存储器
    Ubuntu 16.04 升级OpenSSH至7.7p1
    awk用法笔记
    find命令笔记
    VIM的使用
    Shell
    Linux文本处理三剑客
  • 原文地址:https://www.cnblogs.com/0yst3r-2046/p/11563606.html
Copyright © 2011-2022 走看看