找回密码
 加入怎通
查看: 362|回复: 4

[站长八卦] 站在php细谈SQL注入攻击与XSS攻击

[复制链接]
寻路者 发表于 2013-01-07 16:50:14 | 显示全部楼层 |阅读模式
通常在编程中程序员要考虑的问题不仅是代码效率与代码复用性,而且还要考虑一些安全问题{0 K  v  l7 m- N2 B5 c

; I* `5 W( D) e! |  例如: SQL注入攻击
# A/ c4 f/ Q: o5 A9 C* G) Q. a1 D# A" j: y
  XSS攻击" T+ T% I: S6 F9 B# |4 C$ O- `

# t/ c/ x* I( V) V" e  任意执行代码
& P5 ~6 ?+ O( k' ~9 r8 u  a1 n
2 F1 L, u) c& t/ F& J$ w' p  文件包含以及CSRF.
' ~2 `" I6 w: S" _: D  h2 l3 ]) o
$ x! D5 S1 q- ]+ g: K  }6 ]2 R! _3 B' N& J  [3 ?# [
8 n' s; w" B9 h+ P: u& J( N
  关于SQL攻击有很多文章还有各种防注入脚本,但是都不能解决SQL注入的根本问题
( Z& y* |2 \3 t- x8 R$ X
) D2 Y" ?* s; w* n8 V+ A* b  见代码:  i' h8 W4 k6 k; ~( @
4 F! A0 k- r# S
   & C5 {2 D7 i  C& P! I! g. S
6 C8 ^- S% I, K! n) j8 X0 @; y0 c# |
  mysql_connect("localhost","root","123456")or die("数据库连接失败!");
7 y# {2 Y" _# ^3 N
9 ?& E6 K4 w0 `2 O6 M% `& K  mysql_select_db("test1");
9 a$ p: {  A* r% v2 z/ D  d- d; S5 j+ k
  $user=$_post['uid'];
4 Q( m' \+ I  B6 I9 w3 u* R9 f) I' i/ i; ]
  $pwd=$_POST['pass'];$ P6 h, j" u+ F7 }

, V3 s% w7 n$ m4 P  if(mysql_query("SELECT * from where
; u1 u" i4 q  A2 o6 C& y, h+ ]  n. j- y
  admin* z9 g# J4 L' ^- q' |  [' j7 a. T
! a! @- T& x$ _& b' ~) H
  = `username`='$user' or `password`='$pwd'"){5 x, [* o6 H, A% v" a: m8 x$ \
- W3 S( K# V, i1 k
  echo "用户成功登陆..";- o4 i! k& p1 P. @! U; b0 _

% \& D( [! W& e  X6 q! K8 U% R  } eles {9 X" q  y/ r& n% M  k

9 s8 I! o$ ?) o* k. Z5 s) E) ]6 x  echo "用户名或密码出错";) h) g% b5 K8 b) S  ]
5 J" v9 F3 u+ f: K
  }
9 r6 E$ `4 C3 R: V7 L  }% f6 }/ f: Q6 g  p4 v- F
  ?>
4 S0 N/ h" v8 x; K+ @  A- h, u( x  O& l
  很简单的一段代码,功能是用于检测用户名或密码是否正确,可是在一些恶意攻击者中提交一些敏感代码.后果可想而知.. post判断注入的方式有2种。
2 _1 \1 Q4 `% ?/ B
9 i* i/ c0 ^; S  1.在form表单的文本框输入 "'or'='or'"或者"and 1=1"3 s! m- Q  ^. T1 m5 A

9 ]- m* m" c! y6 D1 D9 @7 p  在查询数据库的语句就应该是:
4 |; F3 e# A  h7 F5 D7 B7 t0 \
3 G; @9 ^+ y. G9 L  SELECT admin from where login = `user`=''or‘1’=1' or `pass`=‘xxxx'
8 |% e. Z+ ^8 T/ s8 O7 p5 t
( D; t& L) X& n" ?  当然也不会出现什么错误,因为or在sql的语句中代表和,或的意思。当然也会提示错误。
, \* R3 _7 J4 v, @! X* @: e% f; F7 H' R9 Y6 F  S* u# Q& ^& N
  当时我们已经发现了可以执行SQL语句之后就可以查询当前表的所有信息。例如:正确的管理员账户和密码进行登录入侵。。( w7 ?0 Y* `) t

9 K, C& ~% N. D, ]2 w7 f8 Y  修复方式1:
' }& {- `# Q: `7 E, D# K' W$ Q2 S  X! S) w' e, D. i
  使用javascript脚本过滤特殊字符(不推荐,指标不治本)
  B4 Q; B2 i0 R. t/ F6 y: T# C8 o6 m* G( a
  如果攻击者禁用了javascript还是可以进行SQL注入攻击。。
/ `/ E0 r2 ]4 E, y6 v4 B  ]" H+ A5 C7 r! ]& q9 C- N/ u# q! \
  修复方式2:
  a: ~) k) |) H: K6 [0 Y# x# s. C0 O4 J( \# S: Y7 K
  使用mysql的自带函数进行过滤。
( B* A1 c; z" P8 ?* W8 _/ d8 {3 o+ {0 |3 S" |
  见代码:# I% i% a9 Y0 I# {1 v5 U, ^

2 e& P% T8 U( a   2 D8 M& d9 \+ b4 ^2 ^1 T4 x+ W
- r8 c! k* R3 t) k2 i8 }- T
  // 省略连接数据库等操作。。# g0 n1 P0 t+ q0 H! H/ |
3 r) {) b6 b5 {/ T  L# c
  $user=mysql_real_escape_string($_POST['user']);
2 v/ Y; B7 c* @, H/ L( B0 m/ x2 p
  mysql_query("select * from admin whrer `username`='$user'");
6 t: B& _9 y. x2 H+ l1 g  w! j" u6 v- Z/ D0 E6 b/ \) S3 H4 g- p
  ?>
. k4 H# Z0 [7 K: i; \( U0 m+ v/ E
! S0 Q( Q2 e$ [' ^/ j3 D  既然前面说道了xss攻击,我们再来说说XSS攻击以及防范吧。。
! g  S9 W5 M$ S0 Z7 U  j2 F, m- ~. C4 _
  提交表单:, d8 d  p% m% d( _, m! N

3 O& L5 }2 j! A' U& W9 a$ G( {  A  ! [: i, R/ C/ \5 z& D
. G0 Z; G9 O, o2 \8 g0 F3 m6 C4 M5 m
  
  C7 G% T3 b* Z$ _5 A
: R' t* l# W% B1 U# ?# M5 @  5 Z$ \" M5 B- u1 E- x( k

' Z" o0 V0 z. r: @% q0 ^: l  ) y0 v$ c* E: \" ^/ Y* t1 h

9 r- R7 s8 p" U  O1 W6 d  j  接收文件:0 x: L$ I( H5 f! {& s& ]

( V2 @: G. H( I* N  if(empty($_POST['sub'])){
2 S3 O8 I: `  S% b  f# l- M8 _% m5 E# H1 w
  echo $_POST['test'];  P- u: m& A/ u" h
  b1 ]. T" c! ?% \& {
  }
+ n$ r5 ?2 }8 |/ o! J- k; D- h$ W2 V' y, X/ H9 V
  很简单的一段代码,在这里只是模拟了下使用场景..% x  D5 N5 P. l5 G. G" ?5 f0 V

. `! b4 @8 y# L  加入攻击者提交
  j0 v$ ?$ |  G: y' T' i: [  K
; J. t$ x6 Z. Y5 e' R    j/ L, N% _2 t& p3 n/ [& F$ m
" ^$ ?- I  B* Y
  在返回的页面就应该显示当前页面的cookie信息。
( M9 |8 T) l: e: w
. _3 t6 M- d! R+ R  我们可以运用到某些留言板上(提前是没过滤的),然后当管理员审核改条信息时盗取COOKIE信息,并发送到攻击者的空间或者邮箱。。攻击者可以使用cookie修改器进行登陆入侵了。。# v! `# W  V, V% f7 h/ K8 P
/ f- |4 |9 z- q. M
  当然解决方案也有很多。。下面就介绍一个最常用的方式吧。
0 a0 ?! f  N9 R5 I  d# F" y
$ I# ?7 d! x( r/ C2 N  修复方案1:使用javascript进行转义0 a+ k/ ^8 r5 k$ @4 S6 n% C$ ]

; y" c" [. w" Z2 n+ J- }  修复方案2:使用php内置函数进行转义
# R* ]* T0 w) y( i8 e
0 U% K" M7 y8 K/ m# g2 q  代码如下:
9 _* e9 `; }0 U
5 \3 O2 f7 b5 e$ ?* y0 T2 {; ~& c  if(empty($_POST['sub'])){
1 k1 z. j/ R3 x9 \' ~3 g* q& [7 B$ W4 k2 v+ z# x& ~
  $str=$_POST['test'];
  ]( u" _" A  Q8 m0 |3 P+ X8 {" \4 V" @8 A# }" a
  htmlentities($srt);
4 L: P( q$ M+ r6 [4 g( q+ ?3 C' j. G: h# P3 A3 X& A) J
  echo $srt;: ^5 d+ y- ~3 e7 r. [3 v

; C! v% E3 i6 X, ~1 `$ |7 d+ y  }
) W! M2 @, N3 y" u! _7 `/ C, T9 a/ x9 g+ V/ P
  好了,关于SQL注入攻击和XSS攻击的案例与修复方法就讲的差不多了。$ k, M$ U. c% f5 V2 a

4 l: q$ \* r: K; p  当然还有其他的解决方法:
4 ?. Z) O0 e: d! y) l
3 c% S! z! L8 ~! K3 ^/ U1 e  例如:使用php框架% l/ x5 _& y9 [5 n9 M5 F

9 d, Y& a- F5 V: r3 L  还有其他的一些方法。。# W/ j) v+ f$ W( q7 u. \% v
1 |, p; \# k& m+ f
  当然了,XSS的运用范围与攻击方式很多也很广。$ l  p3 T: I! {+ C5 r( t# T7 \  h1 {
; w2 g# K6 Y! Z! y& ?
  本文只针对php的提交方式进行过滤,还有其他的需要自己去研究, b& Y, E' c  Z+ M. y; Q* [+ u
解决一切网站安全,湖盟云防火墙:hnhack.com
回复

使用道具 举报

what2016 发表于 2026-02-26 11:06:55 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复 支持 反对

使用道具 举报

辛子 发表于 2026-05-10 10:24:35 | 显示全部楼层
完全赞同,我也是这么认为的,英雄所见略同~
回复 支持 反对

使用道具 举报

星神子 发表于 2026-05-23 21:05:27 | 显示全部楼层
学习到了,之前一直没注意过这个点,受教了
回复 支持 反对

使用道具 举报

baoshai888 发表于 2026-06-03 13:25:08 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复 支持 反对

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-6-12 11:47 , Processed in 0.024394 second(s), 24 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

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