Nctf_web_wp

时间:2022-01-28 04:12:08

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

相关文章