Nctf_web_wp
1.签到题
右键源代码即可
2.md5 collision
这个考点是php"=="的弱相等,为何会出现弱加密呢,是因为在比较==两边的时候,会将字符串类型转化为相同,在进行比较。例如“admin”== 0,这个比较是返回True的,因为会先强制的将admin转化为数值,转化出来的结果就是0==0,所以返回为True。那为什么admin强制类型转化之后取值为0呢?这是因为php在强制转化的时候,如果字符串中没有出现"." "e" "E",则会按照int类型转换,否则转化成float,字符串开头就决定了取的值,如果在合法的数值开头,则使用该值,否则取0。举个例子就明白了:
admin == 0
1admin == 1
admin1 == 0
而如果是带e的则是会识别为科学计数法,故而0e开头的都会识别为相等,因为0的多少次方都是0,所以这就是为什么可以利用php弱相等绕过md5比较了。所以更加安全的比较是 === ,因为 === 会先比较数据类型,再去比较值 。可以直接去搜索百度,能得到一堆
3.签到题
这题考简单的SQL万能密码,尝试在text1中简单地注入,发现注入不进去,另辟蹊径猜测该php中存在其他的参数可以注入,填写正确的密码,然后拼接上id使用万能密码,发现直接返回了flag
4.这题不是WEB
没想到出题人说的是真的,这题确实不是Web,下载网页中gif图片,用winhex打开查看二进制,在文件的结尾处存在flag
5.层层递进
看题目的提示,可以看出应该是信息收集,一步步收集信息的意思,直接查看源码分析链接。
6.AAencode
平台代码可能有点问题。
7.单身二十年
这题直接看网页源代码此处不再赘述。
8.php decode
这题考察典型的使用gzinflate+base64对php进行加密的解密,百度一波,提示的是将eval替换成echo即可。
这里都是针对的是一层加密的,调研的过程中,发现有更高级的用法就是多层加密的,即通过上述的方法,解密出来的东西还是一样的。
下面附上多重加密的代码,替换eval,匹配你想要的字符串即可。
9.文件包含
进入题目,思路很清楚,file参貌似存在文件包含漏洞。
故而这里详述一下文件包含的原理。为什么会存在文件包含呢,开发人员一般会把重复使用的函数写到一个文件中,需要使用的时候直接调用,就免去了再次编写的麻烦,而在调用这些文件的过程就被称为文件包含。几乎所有的脚本都存在文件包含,但漏洞多出现在php中,这是语言设计的漏洞,但这并不代表其他的语言不存在。
其中常见的函数是include() , include_once() , require_once() , fopen() , readfile() ....
下面接收下各个函数的意思:
include():执行到include时才包含文件,找不到包含文件时就会产生警告,但会继续执行脚本。
require():程序运行一开始,就会包含文件,如果找不到包含文件,停止脚本。
include_once()和 require_once():如果文件中的代码已经被包含,则不会再次包含。
其中文件包含的方法总结下来如下几种,应该还有其他方法,日后如果遇到超越如下方法的题目,可以做下标记。
1.直接包含
2.通过PHP内置协议直接读取代码
协议基础:php://伪协议>>访问各个输入/输出流
2.1 php://filter
解释:php://filter是一种元封装器,被设计用于数据流打开时的筛选过滤,简单的讲,就是在代码运行前将代码换一种方式读取。这种方法不需要开启allow_url_include选项。
payload:?file=php://filter/read=convert.base64-encode/resource=xxx.php
2.2 php://input
解释:上面filter支持读文件,肯定还能写文件,而写文件就是利用input将数据post过去。
用法:?file=php://input 数据利用POST传过去,其中如果allow_url_include=on,php<5.30,可以造成任意代码执行,即post一句话过去即可执行。
data://伪协议>>数据流封装器,即include的文件流重定向到了用户可控制的输入流中
2.3 data://text/plain
解释:
用法:?file=data://text/plain;base64,base64编码的payload
phar://伪协议 >> 数据流包装器,自 PHP 5.3.0 起开始有效,正好契合上面两个伪协议的利用条件。说通俗点就是php解压缩包的一个函数,解压的压缩包与后缀无关。
2.4 phar://
解释:
用法:?file=phar://压缩包/内部文件
这一题使用的便是利用了filter协议读取了index.php的源码,
通过base64解密即可得到源码。
10.单身一百年也没用
这题与先前的单身二十年如出一辙,点击之后,会发现有个302的返回包,请求头中就存在flag
11.Download~!
连接打不开,题目作废。
12.COOKIE
根据题目意思,着手点在Cookie上,直接试着将Login=0改成Login=1即可得到flag
13.MYSQL
根据提示的robots.txt,直接访问得到的是一段源码,进行代码审计。发现如下问题,首先是提示文件的名字,试着访问是可以访问的,但是这段代码使用了intval()强制整数转化函数的安全处理,如今并没有办法对intval进行注入的操作。一开始以为是暴力破解id,后来发现也就1024可能存在东西,但是被这个if挡住了,所以要想办法绕过这个if,仔细观察if的条件,条件并不是$id,而是$_GET[id],所以现在的思路就变成了,如果输入!=1024,但是intval[$id]=1024的问题了。
遂上网查一波资料发现如下规则
所以试一波小数,得到flag
14.GBK Injection
这里考察的是宽字节注入,关于宽字节,这题的防御在于使用了反斜杠的转义,故而使用宽字节注入。
如果我们输入1%df呢,我们看看效果
发现反斜杠被吃掉了,这是因为%5c是反斜杠,前面加上%df合在一起数据库会当做双字节识别成一个%df%5c,所以就能造成注入了
那我们只需要对http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df作为注入的网站,用sqlmap跑下来就行了
15./x00
strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
试一下传入一个数组,即可得到flag,因为这里的值都是与false作比较,如果函数出错返回NULL即可
这里还有一个做法就是是1%00#biubiubiu,这一种比较好理解,传nctf=1%00#biubiubiu 接收到1后被截断,后面也有所需要的#biubiubiu,条件成立,拿到flag!
16. bypass again
这题强网杯中有一个更好的题目,这题的考点在于php中md5函数在接受数组的时候会返回NULL,所以如果传入两个数组,那么就会变成NULL===NULL,而强网杯的那一题是只能找出两个相同的md5值才行,也能构造,通过找到两个相同md5的文件,进行url编码,传上去就行了。
17.变量覆盖
这题考察的是变量覆盖漏洞。
经常引发变量覆盖漏洞的函数有:extract(),parse_str()和import_request_variables()
1.extract()
目前使用最常见的就是这风格函数,使用的频率也是最高的,导致的漏洞也是最多的。
extract(array,extract_rules,prefix)
array:输入
extract_rules:可选,作用是检查键名是否合法,其中要注意的是,如果该值等于EXTR_OVERWRITE(默认),如果键名有冲突,覆盖变量。EXTR_SKIP ,如果有冲突,不覆盖
prefix:可选,请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
2.parse_str()
parse_str函数的作用就是解析字符串并注册成变量,在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量。
3.import_request_variables()
import_request_variables()函数就是把GET、POST、COOKIE的参数注册成变量,用在register_globals被禁止的时候bool import_request_variables ( string $types [, string $prefix ] )
$type代表要注册的变量,G代表GET,P代表POST,C代表COOKIE,第二个参数为要注册变量的前缀
这题的代码审计中就考察了这个点
这里讲post进来的数据做了extract,然后比较了pass的值和¥thepassword_123的值,所以现在的目标是让pass和thepassword_123相等既能得到flag,所以这里我构造这样的输入数据,让等式两边都变成空。
可以看到我们已经成功的将thepassword_123覆盖成了NULL,也不一定要是null,只要覆盖让他们相等即可。
18.PHP是世界上最好的语言
网页无法打开,略。
19. 伪装者
看这题的题目就知道考察的点是ip伪造。
在ddctf2018中web第一题也考察了这个点,遂伪造一下ip
但是啥也没有,上网看一波其他人的wp,好像是直接添加了X-Forwarded-For就可以得到flag,可能是后台网站的原因,这题的知识点介绍到这里。
20.Header
题目无法打开,略。
21.上传绕过
这题考察的是文件上传绕过。
一个一个试
Content-Type:pass
00截断文件名:pass
扩展名绕过:pass
00截断文件夹名:成功
22.SQL注入1
这题考察代码审计,给出源码
进行源代码的审计,观察其中的数据库查询语句,发现对输入的pass进行了md5加密,故而没有办法对其进行注入,而user的输入采取了直接拼接的方式,故而直接对user进行注入,输入admin')#将后面的注释,前面的闭合即可,
23.pass check
这里进行源代码审计
发现使用了strcmp进行比较,并作为了if的判断条件,这个和上面提到的md5()弱相等有异曲同工之妙。原理在于这是对两个字符串进行比较,但如果传入函数的不是字符串类型的话,strcmp会返回0,所以这里我们构造数组进行传入,即可得到flag。
24.起名字真难
进行源代码审计
这里有两个条件,一个是必须得是判断key中存不存在数字,第二个输入的数==54975581388,不存在数字如何让他等于54975581388呢,这里同样考察的是php的弱相等,上面提到,==两边会强制转化为同一类型,所以这里我们将54975581388转化为16进制的话也会先转化为十进制,在进行比较
恰好转化出来也并不含数字。得到flag
25.密码重置
这里题目要求的是重置admin,user1无法更改,使用了base64编码,故而这里将admin进行base编码再更改请求主体。即可。。
26.php反序列化
题目不可用,略。
27.SQL Injection
继续源码审计
这里使用了get_magic_quotes_gpc()-,一种默认的配置,如果开启的话,会将特殊字符加上\转义。stripslashes(),删除所有的\字符,htmlentities(),其中的ENT_QUOTES参数的意思是将所有的单引号和双引号。但是要通过闭合单引号怎么办呢?这里根据提示使用\对后面的单引号进行转义,闭合。
后台的语句变成了这样
28.综合题
这里一打开,是下面这个样子。
这里使用的是js编码,直接在控制台中输入。返回一个地址。
继续访问,提示在脑袋里,查看http头发现tip:提示history of bash
这里考察的知识点是--history命令可以用来显示曾执行过的命令。执行过的命令默认存储在HOME目录中的.bash_history文件中,可以通过查看该文件来获取执行命令的历史记录。需要注意的是.bash_history不包含当前会话所执行的命令,执行过的命令在关机时才会写入文件,除非执行命令history -w。
一开始还以为是命令执行,后来找不到参数试了几下也试不出来,后来直接访问.bash_history试了试。
提示刚执行了系统命令 解压了flagbak.zip包,然后访问这个zip包,下载下来,获得flag
29.system(暂时无法做)
30.SQL注入2
同样的是代码审计。
31.综合题2
这题先做前期的信息收集,查看下方有个链接,点击进去。
观察可能是文件包含漏洞,试了一下,果然存在文件包含漏洞,试了一下文本中提示的index.php,say.php
美化后的代码如图
信息收集的过程中还发现了很多文件,都可以通过这文件包含来读取源代码。
其中so.php最为可疑,并且存在sql注入漏洞。
题目有问题,作罢。
32.密码重置2
先看tip,把tip的内容都找到
第一个tip
第二个tip
根据右键源码,访问index.php.swp和submit.php.swp,发现后者有东西
token长度为10,且值要等于0,故而输入10个0试试,得到flag。其实这里用到了弱类型!=,在作比较时也是会先强制转换成整数再做比较。
33.file_get_contents
这题右键源码
发现file_get_contents函数,同样考察的是文件包含漏洞,这里正是用到了上面说的php://input协议任意写
34.变量覆盖
这里题目直接提示了变量覆盖,我们先观察一下源代码。
直接覆盖。。
35.注意!!