你是人间烟火不自知,我在俗世仰望应如是。
Fuzzing
“百度杯”CTF比赛 十月场
题目内容是:there is nothing
用Burpsuite抓包一下,能看到一个hint - -
它要求要大的内部网络,专用IP地址段为: 10.0.0.0–10.255.255.255 172.16.0.0–172.31.255.255 192.168.0.0–192.168.255.255
所以修改请求头,加上X-Forward-For,一个个试一下。
当修改为X-Forwarded-For:10.10.10时,会得到一个新的提示Location。
访问这个php地址,内容是:show me your key.
那大概是要向服务器提交一个key的值吧,GET提交没反应,那就POST方式。
告诉了密文,并且key在md5加密之前是icunqiu***,所以我们需要写一个脚本去找一下key:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import hashlibMD5 = "1b4167610ba3f2ac426a68488dbd89be" chars = "abcdefghijklmnopqrstuvwxyz0123456789" for i in chars: for j in chars: for k in chars: key = "ichunqiu" + i + j + k hash = hashlib.md5(key.encode()).hexdigest() if hash == MD5: print(key) print(hash)
跑出来得到key为ichunqiu105 - -
下一步,是一个新的php文件 - -
来看一下sourcecode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 function authcode ($string, $operation = 'DECODE' , $key = '' , $expiry = 0 ) { $ckey_length = 4 ; $key = md5($key ? $key : UC_KEY); $keya = md5(substr($key, 0 , 16 )); $keyb = md5(substr($key, 16 , 16 )); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0 , $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '' ; $cryptkey = $keya . md5($keya . $keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d' , $expiry ? $expiry + time() : 0 ) . substr(md5($string . $keyb), 0 , 16 ) . $string; $string_length = strlen($string); $result = '' ; $box = range(0 , 255 ); $rndkey = array (); for ($i = 0 ; $i <= 255 ; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for ($j = $i = 0 ; $i < 256 ; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256 ; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for ($a = $j = $i = 0 ; $i < $string_length; $i++) { $a = ($a + 1 ) % 256 ; $j = ($j + $box[$a]) % 256 ; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256 ])); } if ($operation == 'DECODE' ) { if ((substr($result, 0 , 10 ) == 0 || substr($result, 0 , 10 ) - time() > 0 ) && substr($result, 10 , 16 ) == substr(md5(substr($result, 26 ) . $keyb), 0 , 16 )) { return substr($result, 26 ); } else { return '' ; } } else { return $keyc . str_replace('=' , '' , base64_encode($result)); } }
这是一个加密的方法,我们通过调用这个定义的方法去得到flag:
1 echo authcode("d116+lpzwYGeuOp97fQ8DbwUogjZvXwKdAMW1skwPQ6mU2kjOKC3b4bhsN7N9hq03qAfaAXEavDq5YxLilcpnCnuM5ClG8g" ,$operation = 'DECODE' , $key = 'ichunqiu105' , $expiry = 0 );
运行一下得到flag:
flag{c1733e42-2c1c-481c-b49a-5b179dde9421}
Wanna to see your hat?
2017年全国大学生信息安全竞赛
首先是一个登录页面 - -
随便创建一个账号然后登进去,然后有一大堆的 绿帽子 …😶
这个页面上,没看到啥有用的东西,返回到登录页面,抓个包看看 - -
哇有个sql语句欸,尝试修改一下name值,发现它过滤了空格,并且把单引号(‘)转义成了反斜杠(\) - -
但是没关系,空格可以被’/**/‘代替,并且如果把单引号放在payload的最后,那跟在后面的单引号就会被’/‘转义。
发送后,可以看到多了一个’good job’,那应该是成功了,用这个payload去登录吧 - -
Hello World 是一个Hello World界面 - -
先看一下源码 - -
访问一下flag.xmas.js,但是404了,尝试访问flag.js,有内容 - -
有点东西,我甚至把js代码格式化分析了一下,但是太长了,我还是不会做…
然鹅,题目的思路是.git泄露,.git/logs/HEAD文件的利用。如果用githack的话,会漏掉部分object - -
改用gitextract,能提取出两个flag文件 - -
这两个flag是不太一样的,用diff命令看一下不一样的地方 - -
1 diff flag.js flag.js.04bb09
可以看到前面不一样的地方拼起来是flag{ - -
flag{82efc37f1cd5d4636ea7cadcd5a814a2}
Upload
今天开始做web题目,发现前面的都好难,中间的都做过了,就随便挑了一道,发现竟然是去年做过的题目,只是因为flag提交了不对所以没交flag…一年过去了,没有学过python的我还是这么菜,有点难过…我为什么这么菜呢,可能因为我不专心吧…
题目内容是 - -
可以看到响应头这里有个flag - -
base64解码一下 - -
并且每一次刷新页面,flag_is_here:后面的值都会变。需要写脚本读取页面的flag参数的值然后再把后面的值传过去,注意这个base64可以解两次。
去年省赛的一道题目和这个很像,都是需要解码两次base64,小白的我只解一次脚本半天跑不出来,难过死了,,今年比赛估计一如既往地难过…说白了就是窝太菜了。
这道题传的脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 import base64,requestsdef main () : a = requests.session() b = a.get("http://1d244bd2e1664e07b80cc2b714ddc1c4a12576508f544c34.changame.ichunqiu.com/" ) key1 = b.headers["flag" ] c = base64.b64decode(key1) d = str(c).split(':' ) key = base64.b64decode(d[1 ]) body = {"ichunqiu" :key} f = a.post("http://1d244bd2e1664e07b80cc2b714ddc1c4a12576508f544c34.changame.ichunqiu.com/" ,data=body) print (f.text) if __name__ == '__main__' : main()
跑完脚本会给个路径:
1 3712901a08bb58557943ca31f3487b7d
进去看看 - -
是一个login页面,并且需要验证码,但是登录的username和password并不知道…用dirbuster扫一下
1 python3 dirsearch.py -u "http://56608d919c104308800865599180e0c3392214c297e54e30.changame.ichunqiu.com/3712901a08bb58557943ca31f3487b7d/" -e *
发现有svn源码泄露 - -
但是师傅们都是怎么找到wc.db文件的…萌新的我一脸懵逼…菜鸡不配写脚本,只能自欺欺人地假装跑一下23333 - -
username就有了 - -
password随便。验证地方的意思验证码md5加密后前六位是ecd7c7,需要写脚本:
1 2 3 4 5 6 7 8 9 10 11 import hashlibdef md5 (s) : return hashlib.md5(str(s).encode('utf-8' )).hexdigest() def main (s) : for i in range(1 ,99999999 ): if md5(i)[0 :6 ] == str(s): print(i) exit(0 ) if __name__ == '__main__' : main("813e72" )
跑一会儿就能出来,给出了下一个路径 - -
是一个文件上传,直接上传.pht文件就可以了 - -