草庐IT

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

-朝菌- 2023-04-20 原文

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 * from user where id = 1;delete from user
    
    
    • 比如注释符:
    
    # sleep(500)可对系统资源造成极大耗损
    
    select count(*) as num from game_score where game_id = 244 and version = '-1' or 3 and sleep(500)-- 注释掉可能对注入造成干扰的语句
    
    /*
    
    还有这种注释
    
    */
    
    
    • 比如单引号: 1' or '1'='1
  • 针对黑名单过滤

    • sql 语句同义变形体

    • 双写绕过

  • 针对中间链环节如编码

    • 宽字节注入(去掉转义符)
  • 存储型注入,针对后端/数据库输入

    比如:用户名输入admin'#

一般步骤

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

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

  3. 确定显示的字段顺序

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

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

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

  7. 下载数据 (爆数据)

bwapp 中的 sql 注入

(GET/Search && GET/Select)

  • low

    payload: 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-get install sqlite3
    
    apt-get install php5-sqlite
    
    service 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语句,插入、修改管理员信息,甚至执行任意代码。

有关网络安全入门篇:bwapp靶场通关(更新ing)的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  5. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  6. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  7. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  10. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

随机推荐