b站1024程序员节-技术对抗赛
链接在这 ----->> 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
第一题:
PS:提示打开的是AES的百度百科
在线AES加密解密、AES在线加密解密、AES encryption and decryption--查错网
第二题:
第三题:
eval.zip打开是
php代码审计,preg_match绕过和命令执行
打开提示里也是preg_match
<?php /* bilibili- ( ゜- ゜)つロ 乾杯~ uat: http://192.168.3.2/uat/eval.php pro: http://security.bilibili.com/sec1024/q/pro/eval.php */ $args = @$_GET['args']; if (count($args) >3) { exit(); } for ( $i=0; $i<count($args); $i++ ){ if ( !preg_match('/^\w+$/', $args[$i]) ) { exit(); } } // todo: other filter $cmd = "/bin/2233 " . implode(" ", $args); exec($cmd, $out); for ($i=0; $i<count($out); $i++){ echo($out[$i]); echo('<br>'); } ?>
尝试读下源码,需要GET方式提交args参数,args参数的数目不能大于3,就是不止一个,最多3个,中间肯定用&连接了
接着是以输入的args参数的数目进行for循环执行正则表达式,如果匹配就继续,不匹配就退出
正则表达式"/^\w+$/",匹配字符串,\w表示大小写+数字+下划线{ a-z,A-Z,_,0-9,_}。如果不匹配会退出
两个`/``/` 表明正则表达式的开始与结束,`^`开始字符,`$`结束字符,`+`代表可以有一个或多个`\w`。
再接着是用/bin/2233的shell程序执行implode函数合并args参数后的内容并输出到$out变量并echo显示,implode函数是给多个args参数合并到一起
网上找了下preg_match绕过总结-----------preg_match绕过总结 - MustaphaMond - 博客园
大致是用数组类型[]和%0a绕过,第二个的PCRE没仔细看,不太懂。。
所以payload是args[]=1%0a,1可以换成大小写、数字和下划线
再加上其他linux命令参数就是args[]=1%0a&args[]=ls
查看用cat命令需要再加一个args参数args[]=1%0a&args[]=cat&args[]=passwd,其他文件都是空,这里就是最多3个args参数,用[]和数字大小写下划线绕过preg_match函数
其实这里还有点疑问:
1、为什么1%0a参数放前面行放后面不行
2、用其他命令为什么不行呢,是b站做限制了吗,试过ifconfig、w、ss、df,包括ls和/,uname和-r
这些命令可以
第四题:
payload:
{ "user_id": "", "user_name": "1/**/union/**/select/**/1,2,3,4,group_concat(id)/**/from/**/flag", "action": "", "page": 1, "size": 20 }
第七题: