0


网络安全入门篇:bwapp靶场通关(更新ing)

A1 -Injection

HTML Injection - Reflected(GET)

low 级别

low级别意味着没有任何检查

输入·<h1>This is a test</h1>·,可以看到可以被完整解析到页面上

图片

输入<meta http-equiv="refresh" content='0; url=https://xxx:xxx/portal.php

图片

medium 级别

进行和low级别相同操作

图片

发现无法注入成功

抓包可见cookie值有变化

图片

图片

查看源码app/htmli_get.php

图片

进一步找到xss_check_1,在app/functions_external.php中

图片

可以看出medium级别的检查是先将输入的<>转为html字符实体&lt和&gt

然后对输入解码

这里可以看到bwapp提供了三个例子

<script>alert(0)</script>

%3Cscript%3Ealert%280%29%3C%2Fscript%3E //这是对<script>alert(0)</script>的一次编码

%253Cscript%253Ealert%25280%2529%253C%252Fscript%253E //这是对<script>alert(0)</script>的二次编码

不难得出解决办法是输入编码后的代码

这里就不放图了

high 级别

运行和medium相同操作,也是无法注入成功,查看代码

发现是带有ENT_QUOTES参数的htmlspecialchars()函数,

暂时没想到办法

图片

HTML Injection - Reflected(POST)

同GET方式

HTML Injection - Reflected (URL)

low 级别

抓包如图示,将编码部分更改即可

图片

图片

根据源码

图片

也可以更改host

图片

medium 级别

该问题似乎是在 Javascript 中运行的 DOM XSS 中的一个漏洞.

它已在最近的浏览器中得到处理。现在的浏览器可以对URL中的<>字符进行编码,从而导致攻击失败.

可以在老版本的IE中实现进攻.

high 级别

可以从源码看到再次使用了带有ENT_QUOTES参数的htmlspecialchars()函数,不可绕过.

HTML Injection - Stored (Blog)

low 级别

直接尝试注入,可行

图片

medium&high 级别

尝试注入,发现没有被解析

查看源码 app/htmli_stored.php

function htmli($data)

{

    include("connect_i.php");

    switch($_COOKIE["security_level"])

    {

        case "0" :

            $data = sqli_check_3($link, $data);

            break;

        case "1" :

            $data = sqli_check_3($link, $data);

            // $data = xss_check_4($data);

            break;

        case "2" :

            $data = sqli_check_3($link, $data);

            // $data = xss_check_3($data);

            break;

        default :

            $data = sqli_check_3($link, $data);

            break;

    }

    return $data;

}

// app/functions_external.php

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);

   

}

发现最终拦路关卡是 htmlspecialchars(),认输.

iFrame Injection

iframe是可用于在HTML页面中嵌入一些文件(如文档,视频等)的一项技术。对iframe最简单的解释就是“iframe是一个可以在当前页面中显示其它页面内容的技术”

通过利用iframe标签对网站页面进行注入,是利用了HTML标签,实际上就是一个阅读器,可以阅读通过协议加载的活服务器本地的文件、视频等

low 级别

尝试修改参数,成功

medium 级别

尝试low级别相同操作,果然不行

查看代码

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;

}

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_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);

   

}

可以看到检测手法是addslashes()函数,而在iframe标签里,最后面的元素是ParamWidth,所以可以在宽度后附上payload,如图:

high 级别

老样子, htmlspecialchars()函数

LDAP Connection Settings

LDAP Lightweight Directory Access Protocol 轻量级目录访问协议

因为要安装环境,暂时略过

Mail Header Injection (SMTP)

注入原理:

邮件的结构,分为信封(MAIL FROM,RCPT TO),头部(From,To,Subject,CC,BCC等),主体(message),mail header injection,即针对头部的注入.使用telnet对25端口进行手工发邮件的过程的事后会发现,对于邮件头部的字段其实就是换行符0x0A或者0x0D0x0A分割,即\n或\r\n,所以就可以注入了.

由于bwapp邮件服务没设置好,这里也不演示了

OS Command Injection

low 级别

思路就是输入不止一条命令

可以用 ;,可以用 &,也可以用 |

另外,如果没有回显,可能是你的环境不支持nslookup命令

medium 级别

同 low 级别思路,发现只有 | 可以用.

查看代码

可以看到

commandi_check_1()

&

;

替换了.

high 级别

escapeshellcmd()

确保用户只执行一个命令

暂时无法注入

OS Command lnjection - Blind

low 级别

没有回显,通过时间盲注

medium 级别

同理,使用管道符即可

PHP Code Injection

low 级别

观察发现请求页面的message参数,尝试使用php函数作为参数

可以获取/etc/passwd文件的信息

猜测是使用了

eval

函数且未检查参数

medium&high 级别

上图可见移除了

eval

函数,且使用

htmlspecialchars 

来处理参数

Server-Side Includes (SSI) Injection

SSI是用于向HTML页面提供动态内容的Web应用程序上的指令。 它们与CGI类似,不同之处在于SSI用于在加载当前页面之前或在页面可视化时执行某些操作。 为此,Web服务器在将页面提供给用户之前分析SSI。

SSI基本格式

<!-– 指令名称="指令参数">

由于环境不支持,就不演示了

SQL Injection

sql 注入分类

按照注入点类型分类

  • 数字型注入点
  • 字符型注入点
  • 搜索型注入点

按照http传递数据的方式分类

  • get 注入
  • post 注入
  • cookie 注入
  • http请求头注入

按照执行效果分类

  • 基于报错的注入
  • 布尔类型注入
  • 时间盲注

sql 注入的常见方法

  • 特殊字符- 比如分号(堆叠注入):select*fromuserwhere id =1;deletefromuser- 比如注释符:# sleep(500)可对系统资源造成极大耗损selectcount(*)as num from game_score where game_id =244and version ='-1'or3and sleep(500)-- 注释掉可能对注入造成干扰的语句/*还有这种注释*/- 比如单引号: 1' or '1'='1
  • 针对黑名单过滤- sql 语句同义变形体- 双写绕过
  • 针对中间链环节如编码- 宽字节注入(去掉转义符)
  • 存储型注入,针对后端/数据库输入比如:用户名输入admin'#

一般步骤

  1. 判断是否存在注入,注入是字符型还是整数型
  2. 猜解SQL查询语句中的字段数 (order by )
  3. 确定显示的字段顺序
  4. 获取当前数据库 (爆库)
  5. 获取数据库中的表 (爆表)
  6. 获取表中的字段名 (爆字段)
  7. 下载数据 (爆数据)

bwapp 中的 sql 注入

(GET/Search && GET/Select)

  • lowpayload: g%' union select 1,database(),3,5,4,6,7 -- 注意有个空格或者' and 1=0 union all select 1,table_name, column_name,4,5,6,7 from information_schema.columns where table_schema='bWAPP'#
  • medium又是addslashes()函数,此函数的作用是在预定义的字符前加上\进行转义,预定义字符有',",\,NULL数据库如果是GBK编码可以考虑宽字节注入
  • high采用mysql_real_escape_string()函数防御,此函数转义sql语句中的特殊字符,没有想到注入方法

(POST/Search & POST/Select)

基本和 GET 方式一样,多了一步抓包

(AJAX/JSON/jQuery)

  • low使用 GET 请求方式输入 url 并不能查询到数据,原因是没有经过页面 JS 的交互,可以看到禁用了 js 后无论输入什么内容都没有回显于是查看网页源代码可以看到是从sqli_10-2.php获取的 json 数据同样的,抓包也可以抓到:于是从sqli_10-2.php注入接下来和上面一样了
  • medium&high同上也是addslashes()mysql_real_escape_string()防御

(CAPTCHA)

在注入前需要输入验证码,除此之外和上面没有别的区别

(Login Form/Hero)

  • low先找注入点可以 SQL 注入猜测sql语句为select * from user where username=' $username 'and password=' $password ';于是构造payload为:> 用户名: ’ or 1=1#> 密码: 随义
  • medium&high同上也是addslashes()mysql_real_escape_string()防御

(Login Form/User)

  • low和上面一样的方法,发现并不能注入于是从头再来,先试试bee':看不到 password 的回显于是多测几次,发现密码无论输入什么,不会对显示有任何影响后续也尝试了一些方法,也不起作用,只能判断出字段数为9于是使用sqlmap成功获得数据库及表名接下来查看users表的内容查看用户名密码
  • medium&high无法注入

(SQLite)

  • SQLite介绍> SQLite含有一张内置表“sqlite_master”,表里存储着type、name、tbl_name、rootpage、sql五个字段。|字段| 记录信息||- |-||type列 | 项目的类型,如table、index、view、trigger||tbl_name| 所从属的表名,如索引所在的表名。对于表来说,该列就是表名本身;||name | 项目的名称,如表名、索引名等;||rootpage| 项目在数据库页中存储的编号。对于视图和触发器,该列值为0或者NULL||sql | 存放着所有表的创建语句,即表的结构。|
  • low首先安装php sqlite模块:apt-getinstall sqlite3apt-getinstall php5-sqliteservice apache2 restart搜索 man,有三个结果,可见为模糊查询于是尝试注入:接下来常规操作:- 判断字段数: %' order by 6 --- 判断字段顺序: %' union select 1,2,3,4,5,6 --- 查表: %' union select 1,sqlite_version(),name,5,4,6 from sqlite_master --- 查字段: %' union select 1,sqlite_version(),sql,5,4,6 from sqlite_master --- 取值: %' union select 1,2,login,password,4,6 from users --- 解密
  • medium&high无法注入

Drupal SQL Injection (Drupageddon)

CVE-2014-3704

Drupal 是一款用量庞大的CMS,其7.0~7.31版本中存在一处无需认证的SQL漏洞。通过该漏洞,攻击者可以执行任意SQL语句,插入、修改管理员信息,甚至执行任意代码。


本文转载自: https://blog.csdn.net/weicanglv3545/article/details/126298984
版权归原作者 -朝菌- 所有, 如有侵权,请联系我们删除。

“网络安全入门篇:bwapp靶场通关(更新ing)”的评论:

还没有评论