南邮CG-CTF基础题Write up
题目链接:https://cgctf.nuptsast.com/challenges#Web
签到题
查看网页源码找到flag
MD5
在PHP中md5()和sha1()函数都存在一个漏洞,当像函数中传入数组时会无法处理返回同一值,即不同的数组通过md5(),sha1()处理后结果是一样的。同时PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。传一个a[]=240610708过去即可。常见payload如下:
QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a
sha1(str) sha1('aaroZmOk') sha1('aaK1STfY')
sha1('aaO8zKZF') sha1('aa3OFF9m')
签到题2
用burpsuite修改包,发送完整指令拿到flag。或者F12修改maxlenght。
这题不是WEB
下载网页中GIF,notepad打开,搜索nctf即可找到flag。
层层递进
查看网页源码,发现一个so.html的链接,后面属性值的长宽均为零比较诡异,点进去再看源码依然有一个so.html,根据题名层层递进,最后找到一个404.html,源码中隐藏flag。
AAENCODE
win下chrome浏览器打开乱码无法显示(其他浏览器没试过),linux下用curl命令获取网页内容,指令格式为curl url –silent。得到的JS颜文字加密密文,放到浏览浏览器的控制台即console中跑一次(按回车)即可得到flag。
单身二十年
Burpsuite发包截包即可得到flag
Php decode
下载明文密文,在明文中截取和密文同样长度的字段,与密文异或运算后得到flag。一开始以为是要把密文补零再和明文异或结果flag只出来一半,很坑。
文件包含
简单的文件包含,当发现url中有?file=字样时可以修改后面为?file=php://filter/convert.base64-encode/resource=xxx.php来查看对应文件源码,此题好像是直接看index.php源码即可拿到flag。这个语句拿到的源码一般是base64加密的,可以找个在线网站解,也可以在python中用base64库解,base64.b64decode()。
单生一百年
同单生二十年,仍然可用Burpsuite截包得到flag
Download~!
下载链接url=+文件名称base64编码,将download.php编码后下载得到flag
COOKIE
请求头中有Cookie:login=0,改为1即可得到flag。
MYSQL
根据提示查看robots.txt,提示向sql.php提交一个id, id=1024显示再次尝试,其它id均为msg,则可以用1024.1绕过php检测,在mysql中查询时1024.1因为精度问题按1024查询,显示flag
GBK INJECTION
单引号会被/注掉,可以用%df吃掉/封闭id,再使用Union select逐步爆库名表名字段名及字段。大概注入姿势如下:?id=-1%df%27%20union%20select%201,database()%23,其中%27是单引号url编码,%20是空格,%23是#用来注释后面多余的语句。前面的查询是id和title两列,后面也应该是两个,所以凑了个1,试了一下它会显示两列中的第二列,所以把database()放到后面,库名就出来了是sae-chinalover。接着爆表名 -1%df%27%20union%20select%201,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=0x7361652d6368696e616c6f766572%23
这块烦一点,group_concat是把查询结果整合成一块,为了凑两列。information_schema这个表存着所有数据库的相关信息,例如tables这个表里有所有表的信息,table_schema字段存着所属数据库,table_name存着对应表的名字。因为单引号会被转义,所以使用16进制来表示,python下编码为'sae-chinalover'.encode('hex')再加上0x即可。表名如下ctf,ctf2,ctf3,ctf4,news。然后就爆字段吧。用information_schema.columns这个表。
id=-1%df%27%20union%20select%201,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x63746634%23(这个是爆ctf4这个表的,多试一下flag在这个表里)
出两个字段id,flag,再爆flag即可。
id=-1%df%27%20union%20select%201,group_concat(flag)%20from%20ctf4%23
然后就出flag了。
/X00
ereg()在匹配字串是检测到%00会停止,而strpos()会继续,故构造nctf=1%00%23biubiubiu即可得到flag
BYPASS AGAIN
传入值不想等的数组即可,a[]=1&b[]=2,之前提过的md5()sha1()漏洞
变量覆盖
register_global=ON时POST传入数据值会覆盖掉php中变量值,源码中对post数据进行了extract()处理,extract()函数会将数组中的值赋给对应索引,故传入pass=1&thepassword_123=1即可。post可以用firefox的hackbar插件实现,也可以用python的requests库。
PHP是世界上最好的语言
Php会对post的数据自动url解码,网页要求不能传入hackerDJ,但ulr解码后为hackerDJ才能得到flag,故对hackerDJ进行两次url编码上传后得到flag(ps:python中的urllib.quote()以及php中的urlencode()不能对字母进行url编码,可以手工把字母转为ASCII码然后加上%号,第二次再把%变为%25即可)
伪装者
要求本地账户登陆才行,故添加X-Forwarded-For为127.0.0.1,获取flag失败,估计题出问题了。
Header
Flag在响应头里
文件上传
要求绕过检测上传php文件,%00截断用不了,仔细观察回馈数据,发现basename为/uploads/后面的内容加上filename=后面的内容,filename为/uploads/后面的内容加上filename=后面‘.’前面的内容,’.’后面的内容被识别为文件类型,所以filename=后面必须填x.jpg。在/uploads/后面写1.php%00截断,发现不行,于是把%00替换为空格标记该位置,在16进制中找到对应的位置,把20(空格的16进制)改为00截断,提交成功。
SQL1
查看源码,发现可以注释掉SQL中user后面的内容,直接搜寻admin的内容即可登陆成功,在用户名处注入如下admin’)#即可拿到falg。
Passcheck
Strcmp漏洞为传入不同类型的数据比较会报错但同时返回相等的信息,故post pass[]=1即可。在python中执行 requests.post(‘url’,data={‘pass[]’:1}).text即可得到flag。
起名字真难
根据代码知要交一段等于‘54975581388‘的字符串,且每位不能为数字,故post其16进制即可,?key= 0xccccccccc得到flag
密码重置
页面链接url=后为‘ctfuser’的base64编码,改为admin,burpsuite截包再把用户名框里的ctfuser改成admin得到flag。
密码重置2
根据提示查看源码可以找到管理员邮箱,提交管理员邮箱和任意密码后显示fail,根据第二个提示非正常退出vi后会产生’.’+filename+’.swp’的文件,故查看.submit.php.swp文件,可看出当token长为10且为0时可得到flag,故输入管理员邮箱+十个0即可得到flag。
file_get_content
很经典的一类题,传一个文件名上去,要求文件中有某些数据。文件名传‘php://input'这个文件里存着post的数据,同时再Post要求的数据即可拿到flag。即post meizijiu。
SQL2
$query =
@mysql_fetch_array(mysql_query("select pw from ctf where
user='$user'")); 上为注入点,查询结果将与输入密码md5加密后的结果进行比对,假设输入密码为1,则需要让查询结果为1的md5值,用户名处输入‘ UNION SELECT “c4ca4238a0b923820dcc509a6f75849b” #,先用空格加单引号使前面的查询结果为空并封闭单引号,union select +md5(1)查询结果为1的md5加密结果。再用#号注释掉最后的’号即可拿到flag。
SQLinjection
源码对输入进行了处理,htmlentities($str,
ENT_QUOTES);,单双引号将被处理为html文本,即单引号变为',注入点在单引号内,则没办法添加单引号闭合,提示用/可以注释单引号,则可以用/消灭掉一个单引号,query原本为WHERE
name=’$username’ AND pass=’$password’。Admin处填“/”则变为WHERE name=(’/’ AND
pass=’)$password’。再将$password写为” or 1#”
则整个查询语句变为SELECT
* FROM users WHERE name=(‘/’ AND pass=’) or 1。可知查询结果为整个表,则$result不为空且查询结果大于1,获得flag。
综合题
根据aaencode不难看出为js加密,去掉汉字,放到console中跑一下得到一个php文件名称,访问之在消息头得到tip,提示history of bash,查询得知在用户的~目录下有一个.bash_history的文件,其中存放着500条左右的命令行命令,查看后发现一条压缩命令,压缩了一个叫flagbak.zip的文件,下载后解压得到flag。