BUUCTF_WEB

[HCTF 2018]WarmUp

打开链接后是一张图片,看看源码提示source.php,进入source.php后看到一串的php代码,接下来就是代码审计了。

这里需要补充一个知识点phpmyadmin 4.8.1任意文件包含

上图只是做一个粗略的介绍,看不懂的看下面:

首先,白名单(whilelist)里面有一个叫hint.php的东西,访问一下,得到一个

不知道干嘛用,先放着,应该能用上的,毕竟是hint。

然后开始代码审计:

这块相当于C语言里面的main函数,上面部分的内容相当于定义了一个函数,那个函数在main函数里面被调用,先看看main函数长啥样。首先上传一个file,file必须满足三个条件才能继续执行下去:
1.file必须不为空
2.file必须是字符串
3.file在执行emmm::checkFile函数后返回值必须为True。

然后返回去看看emmm函数是干吗用的。

首先传入一个$page,也就是main函数里面的file,从上往下必须满足4个条件:
1.page不为空且为字符串(在main函数里已经判断过了,这里没啥用)
2.page变量必须在白名单里面
3.接下来,两个函数一个mb_substr和mb_strpos,意思就是截取$page中?前面的字符串,然后再进行白名单校验。
4.在url解码后的$page的?前面是否在whitelist里面

接下来开始构造url:
1.根据白名单,那么肯定要构造  ?source.php
2.因为$page的问号前面的东西必须在白名单里面,白名单只包括source.php,所以source.php后面必须跟一个问号。但是如果传参的内容有问号的话不符合传参的格式,然后就会报错,那选择url编码一下。然后,因为url在上传到服务器的时候会自动解码一次,所以这里需要二重编码:? => %3F => %25%33%46 ,所以前面部分就是  ?source.php%25%33%46
3.接下来,只要利用../回到服务器的根目录下,找到flag就行,经过测试,需要4个../,但是多打几个其实也可以,然后就是   ?source.php%25%33%46../../../../ffffllllaaaagggg     

得到falg:

flag{e8046a0c-9eb9-4249-a83c-33f79dee7d7b}

[强网杯 2019]随便注

这里主要用到了堆叠注入以及concat绕过

我相信看了上面的链接之后,读者应该对堆叠注入至少有一个粗浅的认识了。其实很简单,就是用分号隔开然后执行多个命令。

试了一下,发现这里滤过了select。 不知道这里是怎么闭合的,先试试  1';     以及   1; 然后发现当输入  1';的时候,下面会出现一条横线,盲猜就这样子接着输入。试了一下1' order by 2; 可以回显,但是当order by 3的时候,就出现错误,那这边就有两个注入点;

于是构造以下语句:

1';show tables;

出现了两个表名,一个是 1919810931114514 ,另一个是 words。先试第一个:

1';show columns from `1919810931114514`;

这里要注意数字串为表名的表操作时要加反引号(就是键盘esc下面那个按键)

既然已经出现flag了,那就不需要试word那个表了。然后想办法进入flag这个字段就行。

然后再介绍一下预处理语句的使用方式:

PREPARE sqla from '[my sql sequece]'; //预定义SQL语句
EXECUTE sqla; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句

这里我们只需要定义,不需要删除。本来我们只需要构建一句:

1';select flag from `1919810931114514`;

但是前面也介绍过了,这里滤过了select,于是构建:

1';concat("sel","ect flag from `1919810931114514`);

但是这样子没有回显,于是想到了采用预处理的办法:

1';set @sql=concat("sel","ect flag from `1919810931114514`");
prepare mysql from @sql;
execute mysql;

这里的@sql、mysql只是一个变量,随便输什么。

发现这里滤过了小写,那只要set跟prepare随便一个改成大写就行。

1';SET @sql=concat("sel","ect flag from `1919810931114514`");prepare mysql from @sql;execute mysql;


flag{612c6d7e-59c0-45a7-992c-3b0e81f76ff4}

easy_tornado

这里主要涉及到模板注入这个知识点,补充一下:https://www.freebuf.com/vuls/83999.html

首先,打开链接,发现有三个文件。依次点过去看看,第一个文件写的是flag所在的地址:flag in /fllllllllllllag。第二个文件写的是render,再结合题目,盲猜是模板注入。第三个文件夹是hint,提示md5(cookie_secret+md5(filename)),目前还不知道干吗用,先放着。

这里分析一下url,url的格式是filename + 一个哈希值,然后结合一下第三个文件里教你md5怎么算,可能哈希值就是用这个公式算的,然后filename就是 /fllllllllllllag ,然后问题在于不知道cookie_secret。

第一个文件提示 /fllllllllllllag ,先试试filename=/fllllllllllllag试试。虽然报错了,但是很神奇的出现了一个变量叫msg。

这个结合一下render,可能这个就是模板注入的注入点。试试构造 ?msg={{datetime}} 看看这是不是注入点:

有回显,那就是找对了。但是要知道cookie_secret在哪,才能搞到值呀,大佬说在handler.settings变量里面,我不是很懂,文末会给出大佬博客,可以自己去看看,这里等我弄懂了再回来更新。

所以构造:/error?msg={{handler.settings}}

'cookie_secret': 'ef7aabe3-1511-4986-aee0-e2231aa7d73d'

知道了cookie_secret后,就爆MD5就完事了。根据md5(cookie_secret+md5(filename)),先把filename加密了,再两个拼一起进行加密。可以选择在线网站

md5: 3bf9f6cf685a6dd8defadabfb41a03a1

拼一起后:ef7aabe3-1511-4986-aee0-e2231aa7d73d3bf9f6cf685a6dd8defadabfb41a03a1

md5: 1cf14dbc4dce086ab497e3cb3000a994

所以构造payload:file?filename=/fllllllllllllag&filehash=1cf14dbc4dce086ab497e3cb3000a994

flag{4f506c03-993a-4c19-ab8a-a379788c9dff}

或者直接上脚本:

import hashlib
cookie = 'ef7aabe3-1511-4986-aee0-e2231aa7d73d'
filename = '/fllllllllllllag'
md5_filename = hashlib.md5(filename.encode(encoding='UTF-8')).hexdigest()
word=cookie+md5_filename
flag=hashlib.md5(word.encode(encoding='UTF-8')).hexdigest()
print(flag)

大佬博客:https://blog.csdn.net/weixin_44677409/article/details/94410580


[SUCTF 2019]EasySQL

补充:系统变量@@sql_modesql_mode:是一组mysql支持的基本语法及校验规则
PIPES_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

源码可在GitHub上面查看https://github.com/team-su/SUCTF-2019/tree/master/Web/easy_sql
源码如下:

首先看看黑名单:
"prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\",辣么多。然后看看执行的语句:$sql="select ".$post['query']."||flag from Flag";

两种解法:

第一种:正规解法。
通过堆叠注入,使得sql_mode的值为PIPES_AS_CONCAT。构造:setsql_mode=PIPES_AS_CONCAT;
所以整个语句为:1;set sql_mode=PIPES_AS_CONCAT;select 1

flag{94d0355c-9f28-42c4-976c-18bafbfb931c}

第二种:非预期解。
根据题目给的    $sql="select ".$post['query']."||flag from Flag";   来构造query:*,1
然后执行的$sql = select *,1 || flag from Flag;
因为*查询了所有的数据,所以flag也就出来了。


[HCTF 2018]admin

进入页面,观察一下,发现是一个很简单的页面,右上角有注册和登录两个功能。查看了一下源码,发现

那提示很明显,应该是将admin的密码改一下或者冒充admin进行一系列操作。不管怎么样先注册一个账户吧

然后看右上角,有三个(四个)功能区:主页、上传、修改密码、退出。

我的想法是参考我写的文章:https://www.jianshu.com/p/c51db608cf44中的《bug》这一块,修改密码的时候抓包一下,然后把用户名修改为admin,那就可以将admin的密码改了。但是,事实是这个并不能这么玩,抓到的是

莫得用户名,但是这边有session,说不定用户信息就藏在这里。但是我们也没办法对它进行解密啊。

查看了一下修改密码界面的源码,发现了一个好东西

https://github.com/woadsl1234/hctf_flask/

应该是服务器就搭在github上,访问一下这个网址,得到这个服务的源码,接下来进行代码审计即可,先把代码clone下来。因为项目是flask,大佬说先看routes.py。看一下index的注册函数代码:

发现index注册函数没做什么处理,直接返回index.html渲染模版,于是我们看一下templates/index.html代码:

这里提示要登录用户名为admin才可以弹出我们想要的flag:hctf{xxxx}。

这里补充一下知识点:
1.flask的session是存储在客户端cookie中的,而且flask仅仅对数据进行了签名。而签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,这就可能造成一些安全问题。具体可参考:https://www.leavesongs.com/PENETRATION/client-session-security.html
2.flask中session的计算是统一的,GitHub上可以找到具体的脚本,待会会附上。
3.密码的计算需要明文加秘钥,而session的计算也一样,明文自己造,但是我们需要找到秘钥。

首先我们需要做的是找到计算session的秘钥,在那么多py文件中,找到了config.py文件:

盲猜ckj123就是我们需要的秘钥。那接下来找找脚本:链接: https://pan.baidu.com/s/13H5kJIxhAjTeUoZyj-dC3A 提取码: kxck

脚本使用的格式如下:
解密:'python 1.py' + 'encode(编码)' + '-s + 秘钥' + '-c + session值'
加密:'python 1.py' + 'decode(解码)' + '-s + 秘钥' + '-t + 明文'
注意格式,在windows下的操作,文本都需要带上英文输入法下的双引号,而linux支持单双引号。

然后得到了解密以后的session:

{'_fresh': True, '_id': b'4a30a6c0a4830dafb3a022de99f44906ec743ed4779af47471eb406c314845fce8ec7216b0f206ff52df2e11a781a893c7f186101061f89796588187e838bb97', 'csrf_token': b'406525a54149d714aabcb476c778abf10aad4003', 'image': b'mrTu', 'name': '123', 'user_id': '10'}

那把name改为admin,再进行加密即可:

得到:.eJxFkMuKg0AQRX9lqHUWPpJNIAtDqyRQLYY2TvdGjBqflQFN0OmQf58mAzO74t7icKqekF3Hampgex8f1QqytoTtEz4usAUe-hpD35F633BWm_nUKDpoKbxvpNMQiYE4izfI1CB1YaFz7jkr3CgNTF5YXAeD7OKZE2oU8ZqzM0knWasUXewMt9sTdp6jSNqGR0jJgqnvRixoItZrqUtCUTsovAWZXFRXb7juHS7qtcldJWodhcc2EsUOXisopvGa3b_66vZ_AvPM-sGWIrGMwkaxYuFh0EjirVE0pxndMGhV588yDYy-N-O8e-Nayuvqj3T5PCZl_NvccjIF5CW1N1jBY6rG99_AtuD1A_qgbG4.XeiGhg.-AM3md6rj8_HE6Li7r6ARdXZliU


flag{f9a90744-1eca-4913-a165-962d13b8bc58}

注意操作的界面要在index界面进行抓包,不是对修改密码的界面进行抓包。

PS:这里写的只是一种做法,大佬的简书上面写了三种,但是我不太会,这里附上大佬的链接大家自己解读一下。
https://www.jianshu.com/p/f92311564ad0


[强网杯 2019]高明的黑客

不太会写脚本,这个题目的博客也看不太懂,等啥时候会了再做。



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

推荐阅读更多精彩内容