web基础练习题

南邮CG-CTF基础题Write up

2018-02-01  本文已影响0人  a2dd56f6ad89

题目链接: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。

上一篇下一篇

猜你喜欢

热点阅读