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.注意!!
php