要点:
1.rce中waf绕过取反思路 题1
2.falg显示不完全 题2
3.sql注入时,当前数据库查不到flag就需要尝试查询所有数据库 题4
4.ssti,bp重发时渲染界面和回显都要查看,不一定都会回显
[SWPUCTF 2021 新生赛]hardrce
可以看到有eval,说明是是rce
关闭了报错显示
从回显可以看出通过get传参给wllm传
接下来需要绕过黑名单
补充:
在PHP中,foreach循环用于遍历数组中的每个元素。
正则匹配,不能用/过滤,不能有字母,题目提示waf绕过,想到可以利用取反绕过
<?php
echo urlencode(~'system');
echo "\n";
echo urlencode(~'ls /');
?>
结果如下
然后就可以传参了
可以看到有flag,接下来cat /flag就可以了
也是一样的进行取反,然后传参
得到flag
[SWPUCTF 2021 新生赛]sql
可以看到参数是wllm
知道注入点以后就可以尝试用sqlmap跑
发现失败了,注意到有waf绕过
发现输入--+以后会出现弹窗,应该是有什么被过滤了,可以尝试使用#的url编码%23
可以知道是单引号闭合,接下来就要报字段数了
再次出现弹窗,推测是空格被过滤了
这里可以用/**/绕过,并且可以知道字段数为3
找到回显位2,3
爆库名
报表名
报表中字段
查找flag,这里发现flag显示不完全
补充:
flag不完整时,可能是页面显示字符有限使用截断函数(substr、right、REVERSE、mid)等函数进行多次截断,然后拼接得到完整flag
这里会发现substrting被过滤了,选择使用mid函数
wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),21,20)/**/from/**/test_db.LTLT_flag%23
得到第一段flag
wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),21,20)/**/from/**/test_db.LTLT_flag%23
得到第二段flag
wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),41,20)/**/from/**/test_db.LTLT_flag%23
得到最后一段flag
最后拼接起来就是
NSSCTF{89645664-d3a5-402e-a078-c0a7d32a8ebf}
[HNCTF 2022 Week1]2048
打开后是个小游戏,题目是要达到20000分
抓包后看见cookie中有flag is in,尝试之后发现没什么用
查看源代码时发现js文件
在其中找到评判标准
将下面alert这串执行语句放到控制台就可以得到flag
[LitCTF 2023]这是什么?SQL !注一下 !
下面提示是id,也可以在上面输入,找到注入点以后就可以判断类型了
不是单引号闭合
尝试后发现是数字型
还是不对,再次查看回显
发现闭合方式应该是))))))
字段数是2
查看回显位
爆当前数据库
爆表名
爆列名,然后会发现没有flag,这时候就查别的数据库
查看所有数据库
?id=1)))))) union select 1,schema_name from information_schema.schemata--+
爆ctftraining中的表名,在下面找到flag
爆列名
得到flag
[CISCN 2019华东南]Web11
打开题目可以看见提示ssti
补充:
Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。简单来说就是一个联通前端和后端的通道
SSTI就是服务器端模板注入(Server-Side Template Injection)是指在服务器端模板中存在漏洞,允许恶意用户通过注入攻击代码来执行任意命令或操作。在一些常见的Web框架中(如Python的Flask、PHP的ThinkPHP、Java的Spring等),用户输入通常会经过控制器(Controller)处理,然后传递给模型(Model)进行业务逻辑处理和数据库操作,最后再返回给视图(View)层进行渲染展示。
SSTI漏洞的根本原因是服务器端未经过滤的接受了用户输入,并将其直接作为模板内容的一部分。在模板引擎渲染过程中,恶意注入的代码会被执行,从而可能导致敏感信息泄露、代码执行、甚至服务器被入侵。
绕过方法
1.大多数的过滤绕过都可以使用get请求request.args.a或者request.values.a来传输参数
例如:?name=request.values.a&a=cat /flag
2.过滤了下划线这些的话可以使用attr和get请求结合起来绕过
例如:?name=a.b
可以改为?name=(a | attr(request.args.a))&a=b
3.如果过滤的比较严谨,可以尝试使用类似于盲注的形式,后面有解释
4.可以使用{%%}绕过{{}},有些另类的过滤方法比如,他去过滤{{}}这个里面的参数,{%%}而这个里面的参数却不去过滤直接给无视了
打开环境后可以看见请求头
给的两个链接都打不开,也不知道是干什么的,但是提示了xff,要伪造ip,结合前面知道的ssti,应该就是需要通过ssti的方式伪造ip,先抓包改改看看
发现可以通过xff修改ip显示,接下来就可以尝试通过rce查看flag,这里还需要绕过ssti
发现flag
这里并没有显示,查看一下显示
有flag了