0%

红明谷&虎符CTF

红明谷&虎符CTF

周末两天两场,被暴打的两天。为什么还是这么弱呢。。。
两天上午都在摸鱼,下午的题一个都做不出来,废人

红明谷

上午摸鱼,听师傅说题目都很简单(虽然可能对我来说不简单),但是他都解决了。所以我就看了下午的这一个题

happysql

据说是布尔盲注加无information_schema取表名和无列名注入。。。听起来也挺难的,无information_schema用的是mysql.innodb_table_stats

writeshell

没看不知道有哪些过滤,用短标签<?=?>替换PHP,反引号执行命令,通配符获取flag

ThinkPHP 3.2.3反序列化

远古版本的thinkPHP
echo了反序列化的数据,那么反序列化的利用点就是__toString或者__destructor,简单的看了一下__toString,完全不可利用,析构函数太多,直接翻到一篇文章ThinkPHP v3.2.* (SQL注入&文件读取)反序列化POP链,题目的代码都和这篇文章的测试代码一致。估计是看的这个文章出的了。。
thinkphp的SQL功能不是预设定好一个数据库要用的时候直接去查,而是每次可以自己临时创建连接进行交互。这个反序列化能做的事情就是让目标向一个任意数据库发起连接并执行可控的查询语句。
具体的pop链就看文章吧,这个师傅也给出了一个对应的payload

乍一听感觉没什么用,因为连接上一个数据库是需要提供数据库名用户名和密码的,我可完全不知道目标机器上的数据库用户名密码是什么,完全打不了

所以这个师傅提出了一个我没见过的操作,恶意SQL服务端。当客户端连上SQL服务端时,服务端可以向客户端要求提供文件,从而做到任意客户端文件读取,而这个操作本身并不需要客户端主动进行文件的提供,服务端可以在任何查询语句后回复文件传输请求,又因为MySQL协议的一个特殊功能是客户端根本不跟踪请求的命令,完全基于服务器响应执行查询。所以当客户端提出了一个正常的查询请求之后,服务端的回复是请求客户端上的文件,客户端也会老老实实的发过去。为此,MYSQL文档中也曾提到客户端不应当连接到不受信任的客户端。
tp使用的是MySQL的PDO扩展,默认不允许读取本地文件,但是我们现在完全可控连接时的设置,所以设定MYSQL_ATTR_LOCAL_INFILE为true即可

使用一些现成的工具就能伪造一个SQL服务端,执行任意文件读取
抄一个GitHub上的,用python2运行即可

按照上面的文章里读了tp的SQL配置文件,但是SQL配置文件和发的源码是一样的,数据库各项均为空。不知道打哪

直接读flag没读到,读start.sh发现应该是把flag写进了数据库,也暴露了用户名和密码是root/root,然后还是连不上去。等wping
想用上次比赛的那个很鸡肋的__toString反序列化,惊讶的发现居然这个类不能被序列化和反序列化。怪不得从来没有在原生类利用里看到这种东西过

看wp

root/root没登上去,root/123456登上去了,真有你的啊出题人,然后就是正常报错注入了。。

虎符

也是咕了上午,下午的题也不会做

签到

最新新闻,这个题看了一下,在留言那里有一堆乱七八糟的过滤但是我还是想不到怎么利用,最后出题人放了hint才知道想表达什么。。。搞心态
PHP服务器被日,8.1开发版被提交了一个后门上去,只要UA里字符串以zerodium开头,就把剩下部分走一个eval
那么直接走一个eval就行了

unsetme

也看了一眼,源码也给的极其诡异,猜得出来是一个框架,加上特殊的变量名,很容易搜到是一个叫做fatfree的框架,题目只提供了一个unset功能,下一份源码看,直接搜__unset方法,接受一个key,最后实际调用的是clear方法,clear方法经过了一系列判断之后把传入的key进行一个compile,然后直接拼接字符串放进eval。。。
compile写的相当复杂。。但是实际上好像如果我们传入的数据本身就不是什么正常数据的时候并不会发生任何改变。直接进行拼接eval就可以了

慢慢做

先是一个SQL注入,语句大概意思是SELECT * FROM USERS WHERE password='md5($password,true) LIMIT 0,1,这是后来hint放出来的。。
不然猜这个东西也太离谱了一点,摸出来一个玄幻串129581926211651571912466741651878684928md5之后会出现'or'8这种情况,字符串类型转换成数字且不是0直接万能密码登进去。然后给了一个gopher界面,可以打gopher的内网ssrf,并说ssrf登录admin.php就能获得flag
不知道下一步打哪里了。并且gopher感觉好像语法也没问题,写出来为什么一直504Gateway Timeout呢?

看wp

由于未知的504错误,打不通。看了别人的wp,就是gopher发POST请求进行堆叠注入,flag在另一个表下,通过rename表的方式查数据
(就是那个很经典的强网杯”随便注”)

intarnet

也是个打内网ssrf的题,用js写的,给了源码
第一步登录是超级sha1,要求sha256(sha256(salt + 'admin') + sha256(salt + 'admin')) === sha256(sha256(salt + username) + sha256(salt + password))且不能进这个条件!username || !password || username === password || username.length === password.length || username === 'admin'
令username为数组即可绕过,username[]=admin&password=admin

第二步是打一个ssrf,有get和post两种方式,post的话完全不可控,感觉无法利用,get的话需要过这么一个waf

function SSRF_WAF(url) {
    const host = new UrlParse(url).hostname.replace(/\[|]/g, '')

    return isIp(host) && IP.isPublic(host)
}

这个地方我真没想到怎么过,一开始都想着去找这些库解析上的漏洞了。。。结果发现这种类型的问题都可以用302重定向解决。。。在这上面栽了两三次了还没长记性呜呜

访问flag路由会得到hint,hint说内网里面还有一个Netflix的什么服务??不会做

参考文章

通过MySQL LOAD DATA特性来达到任意文件读取
CSS-T | Mysql Client 任意文件读取攻击链拓展