GXYCTF 2019刷题笔记

[GXYCTF 2019]StrongestMind

在这里插入图片描述源码看不到什么东西,扫描出几个php也访问不了,也没有js给你改多少次。
想了想只能用python了,写脚本让它对个1000次即可。
注意一定要带上cookie!!!请求方式一定是post(搞了一早上都不得后来才发现表单要post提交)!!!
cookie这个坑说一下,你要是不带它就以为你每次都是第一次进这个网站,带了它就知道你不是第一次,是在上一次访问的基础上继续访问的,Referer我也带了,不知道它是不是也是坑,反正我带了,不过只有Referer没有cookie就没有用,必须带cookie。
逻辑:第一次肯定错,然后获取此次页面上算式的答案,作为下一次的表单提交数据,就可以让以后的下一次是对的。第n次类推。

import requests
import re
#by hcja666
#不知道可不可以多线程,能力暂时不足只会单线程,求佬们分享建议了。
aaaa = 0
sburl = "http://node4.anna.nssctf.cn:28122/index.php"
data = {'answer': f'1'}
def getflag(url):
    global aaaa
    global data
    for i in range(1001):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0',
                   'Referer':'http://node4.anna.nssctf.cn:28122/index.php',
                    'Cookie':'PHPSESSID=a2d18d024bef647bb79bafcc9cfc78ea'}
        print(data)
        res = requests.post(url, data=data, headers=headers)
        res.encoding = 'utf-8'
        da = re.search('<br>(?P<der>第 .+ 次成功啦)<br>', res.text, re.S)
        num = re.search('<br>(?P<number>\d+ [-+] \d+)<br>', res.text, re.S)
        print(da.group('der'))
        check=re.search('第 (?P<h>.+) 次',da.group('der'), re.S)
        print(check.group('h'))
        if int(check.group('h'))>=1000:
            print(res.text)
            
        aaaa = eval(num.group('number'))
        print('下一次答案', aaaa)
        data = {'answer': f'{aaaa}'}

getflag(sburl)#运行即可

到了一千次后,发现源码并无flag,别担心,在浏览器页面刷新一次即可,或者在网页上随便再提交一个数上去也得。

[GXYCTF 2019]BabySqli

在这里插入图片描述看了个源码,有个search.php,发现注释中有编码
在这里插入图片描述好像是base编码,base16不得,base32看看,得了,得到一串base64编码,再次解码发现是查询语句的格式
在这里插入图片描述
判断出是单引号闭合。输入1’ or 1=1–+ 得到下面的东西
在这里插入图片描述
继续测试发现or被过,但是发现and没被。账号输个admin密码随便,发现报错说密码错误,这密码也不好蒙,试试报错注入,最后发现是括号被过滤 了,函数名没问题(六)。
然后union没被过,select也没被。如下图,wrong pass说明账号语句对了,只是密码错了,所以可以猜出是三列。
在这里插入图片描述

https://blog.csdn.net/weixin_52118430/article/details/125107854这篇佬的文章教你怎么没有database爆出库名
在这里插入图片描述
然后没啥法子了,括号都过了,sql注入学的还不是很多,还是看了答案。https://blog.csdn.net/x1520700/article/details/124921221
可以试探用户名的位置,发现是第二个字段位置,猜测password是第三个字段。
在这里插入图片描述
来到本题考点的另一个:mysql在查询不存在的数据时会自动构建虚拟数据,一般数据要么明文,要么MD5。
这里password是第三个字段的话,select的第三个字段可以试试和password相等,如下。
在这里插入图片描述
还是不行,将select第三个字段md5一下,pw的值保持不变,即等于select第三字段名没编码时的值
在这里插入图片描述ok。

[GXYCTF 2019]Ping Ping Ping

在这里插入图片描述
由题可知执行的是ping,命令,用命令分隔符来插入我们要执行的命令。
在这里插入图片描述
cat下flag,发现flag字样被ban了,空格和${IFS}也被ban,但是$IFS$9没有
可以这样127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
因为发现bash也被ban了,还可以用sh…
这个命令行操作的含义如下:
1.echo Y2F0IGZsYWcucGhw:将字符串Y2F0IGZsYWcucGhw输出到标准输出。
2.|base64 -d:使用base64命令对标准输出中的内容进行解码。
3.|sh:将解码后的内容作为shell命令执行。编码的字符串是cat flag.php,但是执行后要查看源码才能得到flag,想直接看用tac命令即可。

[GXYCTF 2019]BabyUpload

上传php,改Content-Type发现不得。
在这里插入图片描述
真给他改个图片后缀也不得
在这里插入图片描述
应该是对文件内容做了检查,我想想应该还可以用js来插入php
因为要传图片🐎,所以试试.htaccess。有坑,Content-Type:必须是 image/jpeg。png不行。。。。
再传个图片🐎,叫she,写上
GIF89a

最后蚁剑链接,注意连的是是图片马的地址./upload/64ff587aaf73ec235416c1cbf2c24e25/she
在这里插入图片描述
(以下低级问题可以不看)
我知道可以直接命令读flag,但是我想用蚁剑连,因为好几个月了每次文件上传的题蚁剑都连不了,即使我传了htaccess或者usr.ini,我想看看到底怎么个事。
从下面的文章我发现个东西。
https://writeup.ctfhub.com/Skill/Web/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/igWAbQLuV5hDSjGssDxLpa.html
ctfhub这题传htaccess后再传了个无后缀的文件,文件内容一样是马。
后来发现如果htaccess文件是
<FilesMatch “sj”>
SetHandler application/x-httpd-php
</FilesMatch>
可以匹配sj和sj.jpg。但是
<FilesMatch “sj.jpg”>
SetHandler application/x-httpd-php
</FilesMatch>
只能匹配sj.jpg文件。

AddType application/x-httpd-php .jpg只要你后缀是jpg就能变成php.

[GXYCTF 2019]禁止套娃

进去啥也无
dirsearch扫描发现git泄露
githack启动,之后把index.php源码搞到手。

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data://|filter://|php://|phar:///i', $GET['exp'])) {if(';' === preg_replace('/[a-z,]+((?R)?)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(FILE);
?>

无参数rce
试试常见payload:
show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
scandir() 列出 images 目录中的文件和目录。
readfile() 输出一个文件。
current() 返回数组中的当前单元, 默认取第一个值。
pos() current() 的别名。
next() 函数将内部指针指向数组中的下一个元素,并输出。
array_reverse()以相反的元素顺序返回数组。
highlight_file()打印输出或者返回 filename 文件中语法高亮版本的代码。
current(localeconv()) 永远都是个点(linux中表示当前目录)
localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
current() 返回数组中的当前单元, 默认取第一个值。
pos() 是current()的别名。
localeconv返回数组的第一个元素是小数点,Linux中点表示当前目录,pos获取这个点号后,加上scandir就会返回当前目录所有文件组成的数组。配合其他函数可以将flag.php输出。

果然可以。
在这里插入图片描述
路还很长,继续努力吧。

  • 31
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值