0%

刷题记录-1

HCTF2018 WarmUp

这道题还是挺有意思的,不过还没完全吃透,看着别人的WP勉强能看懂一点。

按F12发现存在source.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 <?php
highlight_file(__FILE__);// highlight_file() 函数对文件进行语法高亮显示。
class emmm//定义emmm类①
{
public static function checkFile(&$page)//将传入的参数(这里是file)赋给page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//定义whitelist白名单
if (! isset($page) || !is_string($page)) //非定义或者非字符③
{
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) //变量page在变量whitelist的白名单内④
{
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);//过滤?
if (in_array($_page, $whitelist))
{
return true;
}

$_page = urldecode($page);//url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);//过滤?
if (in_array($_page, $whitelist))
{
return true;
}
echo "you can't see it";
return false;
}//checkFile检验
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) //变量file非空,为字符串,且能通过checkFile的检验
{
include $_REQUEST['file'];⑥
exit;
}
else
{
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

①class定义类详细解释

②static是定义静态变量,function定义函数

isset判断变量是否定义,is_string判断是否为字符串。

in_array的详细用法

mb_substrmb_strpos的详细用法

include的使用

首先尝试/?file=source.php页面返回的仅仅是又打印了一边source.php中的源码,接着尝试

/?file=hint.php发现页面底部出现了flag在ffffllllaaaagggg的字样。然后尝试

/?file=hint.php?../ffffllllaaaagggg至于这里的?我现在还是不太懂,然后逐渐增加../的数量,增加到第5个时,flag出现。

[强网杯 2019]随便注

首先要了解一下PHP中的数组,以及var_dump函数

这里要用到堆叠注入

堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

摘自:

作者:dawsonenjoy
链接:https://www.jianshu.com/p/c50ced83414d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

判断闭合方式

用Hackerbar,不要直接在输入框里输,会过滤。

经过判断后,闭合方式为单引号。

判断字段数

判断判断字段数,结果为2。

爆库

接着用union 和select爆库,结果发现select被过滤了,不能用

image-20220202194305288

这里要用到show databases,注意与select database()的区别,前者是显示所有数据库名称,后者是显示当前数据库名称。

image-20220202194436341

爆表,爆字段

image-20220202201329717

words表中的字段

image-20220202202215263

1919810931114514中的字段

image-20220202202305894

查看flag

根据words中字段的回显,有很大可能输入的数为id,然后猜测语句为

select id,data from words where id=

根据1' or 1=1--+的回显,可得words表为

id data
1 hahahah
2 miaomiaomiao
114514 ys

所以,我们把表名1919810931114514改为words然后查询flag即可

1
2
3
1';rename table `words` to `words0`; 
rename table `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);

然后用1' or 1=1;--+查询的flag

image-20220202224533519

粗心的小李

scrabble的用法请见这里。用docker搭建测试环境后,用Ubuntu打开物理机的IP v4地址。

image-20220202225656448

然后用scrabble直接获取源码,得到flag。

image-20220202234437902

[SUCTF 2019]EasySQL

首先尝试了一波判断闭合方式,结果发现越来越不对劲,有三种回显,要么空,要么是数组,要么就是Nonono,然后尝试了堆叠注入,发现果然行!!!但是最后用到show columns from Flag却回显Nonono,初步判断有字符过滤,于是用Fuzz字典判断一下过滤的字符,结果如下

handler
like
sleep
delete
or
insert
&
&&
handler
INFORMATION
xor
AND
CREATE
from

然后又进行了一番尝试,发现2和2;返回值不一样,说明输入的值被嵌入了某个语句中

方法一:

PIPES_AS_CONCAT:将【||】原本的“或”转换为“连接字符”,就是将||前后进行拼接

使用方法:PayLoad1【1;set sql_mode=PIPES_AS_CONCAT;select 1】

拼接过后的结果就是【select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag】

方法二:

我们传递过去的内容会被解析为$sql = “select “.$post[‘query’].”||flag from Flag”;

因此我们可以在传递值这边做文章,让数据库进行错误的判断

我们可以尝试传入1,1

返回回来的结果

image-20220203002112267

在数据库中的操作
我们可以发现,这里的内容查询不是对【1,1】||【flag】而是对【1】,【1||flag】

这就是数据库对符号的判断不严谨,导致的非预期漏洞

我们就可以将”,”前的内容改为“ * ”, 从而构建PayLoad【 *,1 】

PayLoad2:【 *,1】

[ACTF2020 新生赛]Exec

这里又出现了新知识。

Linux中的命令连接操作符

  1. 和号操作符 (&) ‘&’的作用是使命令在后台运行。只要在命令后面跟上一个空格和 ‘&’。你可以一口气在后台运行多个命令。
  2. 分号操作符 (; ) 分号操作符使你可以一口气运行几个命令,命令顺序执行。
  3. 与操作符 (&&) 如果第一个命令执行成功,与操作符 (&&)才会执行第二个命令,也就是说,第一个命令退出状态是0,后面的才会执行。在UNIX里面,0表示无错误,而所有非0返回值都是各种错误。
  4. 或操作符 (||) 或操作符 (||)很像编程中的else语句。上面的操作符允许你在第一个命令失败的情况下执行第二个命令,但第一个命令成功则第二个不会执行
  5. 非操作符 (!) 非操作符 (!)很像except语句。这个命令会执行除了提供的条件外的所有的语句。这个是纯逻辑操作符,注入很少用
  6. 管道操作符 (|) PIPE在将第一个命令的输出作为第二个命令的输入时很有用。
  7. 优先操作符 () 指定优先级
  8. 连接符 () 连接符 ()如它名字所说,被用于连接shell中那些太长而需要分成多行的命令。可以在输入一个“\”之后就回车,然后继续输入命令行,直到输入完成。

这里首先要判断该题的类型,题目为Exec,所以这里我们有必要知道什么是ExecShell。Exec的中文意思是”命令执行“,所以这里和SQL注入关系不大。

上面我们了解了linux中的命令连接符,所以我们逐级构造1;cd ../;ls1处可以随便输。

当构造为1;cd ../../../;ls时,目录中出现flag

image-20220204122557483

然后获取flag就可以了1;cd ../../../;ls;cat flag

image-20220204122646306

[极客大挑战 2019]Secret File

查看源码发现./Archive_room.php,进入该文件。

查看源码发现action.php文件,但是打开后变成end.php文件。所以判断结果为action.php出现时间很短,然后立即出现了end.php文件。所以我们这里用Bp拦截,然后发现action.php文件源码中有secr3t.php文件名,所以我们继续访问该文件。然后发现该文件中提示源码在flag.php文件中,所以我们再进入flag.php文件。进入后提示flag就在这里,只是我们看不到,找遍源码也没找到。所以猜测是被过滤了。所以这里要用到php://filter协议,所以我们让文件以base64编码的形式输出,就不会被过滤了

构造?file=php://filter/convert.base64-encode/resource=flag.php,因为要看到输出的base64编码,所以要再secr3t.php界面输出,结果如图

image-20220204135439694

然后解码得到flag