找回密码
 加入怎通
查看: 348|回复: 1

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

[复制链接]
寻路者 发表于 2013-01-07 16:50:14 | 显示全部楼层 |阅读模式
通常在编程中程序员要考虑的问题不仅是代码效率与代码复用性,而且还要考虑一些安全问题{
" e! I9 i3 c, R1 \, |9 R. ?, \% S  y! h; h7 o
  例如: SQL注入攻击$ C6 g# n- o: x" ~! Q( ?, F

- m) S) k0 L8 z& y* F, x' d  XSS攻击
# Z! R* _3 F3 e. I: _4 D5 k- E) c% _( h; y0 W4 b& D
  任意执行代码8 P5 Z* h7 o& D& I- Q: W4 d; Z% R
  ]% l& \3 z+ n2 J; R
  文件包含以及CSRF.) B3 W8 z, @  u1 }. w, K
5 @7 b/ @3 S, ]6 a3 V* ~
  }
- {6 F" u6 s8 n* k" s* E
$ T% v! i# y/ ?: x  关于SQL攻击有很多文章还有各种防注入脚本,但是都不能解决SQL注入的根本问题
9 s- W; n. T1 J! `/ ~* `% P; t4 M, Y: |  o1 }5 {* V0 j
  见代码:" c  ^$ G& ~, f+ k
. d' t+ z' q; m0 a. n* I/ g3 {
  
4 F& @/ ]: Z8 Y& O5 N$ `9 Y% D: E' U
- p" q0 Y# i* N$ X& N$ P  mysql_connect("localhost","root","123456")or die("数据库连接失败!");
" s8 Q% _" V! R) }/ k! I  X: G) E3 q0 a
  mysql_select_db("test1");
1 [' i$ E% }! D2 w
' K% G, Z( N8 c; L) {$ _  $user=$_post['uid'];
* y) z: D! ]" S1 x4 P  x9 c: f5 M- v. a
  $pwd=$_POST['pass'];
; I+ I" p7 |$ e, G* J! a+ S4 e3 g5 M8 V3 q# P) v! X% W
  if(mysql_query("SELECT * from where
! L" C8 g/ [$ D
6 u" Y7 B1 _; A3 g3 l, x, ~! `  admin
3 \- y* r' j+ {% Q
9 m8 ^2 E3 x  F, w  = `username`='$user' or `password`='$pwd'"){! m+ D: _! w# M1 z7 V( p

* C4 W, i! y' E+ j: o  echo "用户成功登陆..";( U8 B1 d4 i) o! R! C8 y- n
1 A5 B( ^. p9 ?8 _( N
  } eles {
# D* z/ K& O1 o! f% f/ D6 _$ w) E! B3 C) Q
  echo "用户名或密码出错";, [7 l. m5 S7 G* v5 G  h* {' W& _. i

4 @4 F# J" E' o0 l  }) @/ x; W! c6 N* P9 |2 L
4 h% A  R. L* ?! ?/ `! K
  ?>
( y( k5 O$ i; \8 {- ]
* b' ]1 c$ [/ n, `: O6 s8 y8 c3 S/ E# V  很简单的一段代码,功能是用于检测用户名或密码是否正确,可是在一些恶意攻击者中提交一些敏感代码.后果可想而知.. post判断注入的方式有2种。' v6 O" W5 ?- a. ^) _

2 s& ^) T8 H# w, s8 S! v0 p5 O7 N  1.在form表单的文本框输入 "'or'='or'"或者"and 1=1"
# H8 \& U1 q7 L2 P9 }- w; R. i# t6 r) o
  在查询数据库的语句就应该是:5 @8 v4 Y* H4 U( t3 @, w' Z
: D" H4 F8 [- \0 ?1 F
  SELECT admin from where login = `user`=''or‘1’=1' or `pass`=‘xxxx'
; ]* q% E7 X4 A8 E5 u6 N! e, i
, E1 w* o* n' v+ W9 N$ a; Y  当然也不会出现什么错误,因为or在sql的语句中代表和,或的意思。当然也会提示错误。
) s9 q* Z" q9 d7 R! r1 J% o. v6 s# Z1 l6 X& y3 y2 {8 C, m( _
  当时我们已经发现了可以执行SQL语句之后就可以查询当前表的所有信息。例如:正确的管理员账户和密码进行登录入侵。。% _2 E; I2 L. q, X

" J( J4 i2 ]& l  修复方式1:
4 t% ?$ }- r' ?* h  k' ?, ?# }, p* K6 `, A* Q) c
  使用javascript脚本过滤特殊字符(不推荐,指标不治本)) q7 c, w* r9 N# x  G9 `) J
6 }  [! f8 j% f6 Z( R
  如果攻击者禁用了javascript还是可以进行SQL注入攻击。。
* v( z2 |: F0 N) i' x0 @9 ]2 P/ |9 F
  修复方式2:
" A1 A  X" w) f8 D; p4 t
/ H7 L! @* g( m) R0 D  e  使用mysql的自带函数进行过滤。1 y" V% ^+ ^( j7 p, }3 k

' u, v+ U4 @+ p; S( Y! L& V/ J) p  见代码:
/ Q4 W( V# d! {0 n) Y0 V
6 `4 r- [: I! t$ M% K, R7 U* Z  
5 f' c4 @3 S( n( {3 w0 v% V0 [/ g9 R, `- p; F# Q% d; {
  // 省略连接数据库等操作。。5 N- R  L/ G3 R' h8 ^7 w0 m3 F: X6 _. @
& I1 k6 e2 _/ D/ _" ]) z# \3 z
  $user=mysql_real_escape_string($_POST['user']);/ f. P! p) Q$ n6 I7 o$ w" {4 ?
* o* w2 t3 w, [" h( @9 U3 X' `' {9 y* N
  mysql_query("select * from admin whrer `username`='$user'");! h5 |# w8 W: r
# F2 m6 x& L4 h5 P( j2 h/ j1 |* ~( E
  ?>
1 M) F. }& A9 v" a" T9 R: b7 l% L' F( E7 u5 N  R% k+ W4 j1 p) o, \
  既然前面说道了xss攻击,我们再来说说XSS攻击以及防范吧。。
" @1 n3 Z% d, w0 O3 T. R4 X( q+ C- g
  提交表单:" d# G% Q, b" q3 ~8 H
9 M  C! {. X% h4 o6 M  d
  
' O  U. F. e9 T& o  }7 `4 f3 m; C1 W
  4 ~! [/ Y7 }& j1 \6 k; X& l

: e/ [9 d6 e3 q7 D' S; X    C5 A, ?9 W( m1 S: d6 {
. w9 x% R2 v8 t/ Q9 u3 h. p! S
  # t: E' g( }2 e* o$ y; J5 f/ B- d
2 h! e2 l0 V& L7 ]
  接收文件:
" d/ j' K. G% u8 {+ k) x: H0 V4 X8 i: i5 u) V1 ^: m
  if(empty($_POST['sub'])){
( C8 K9 R! p; l9 o( W8 R" x/ w4 X! W: Q$ c9 F! b
  echo $_POST['test'];
0 _, U6 `* u8 \  h$ R. ~4 v1 h9 S. C# u3 R1 i- l
  }- q8 o5 G2 m* o2 k9 i6 n- N
+ ]" B$ ^  X. s8 W3 u% C7 E/ X( k# g
  很简单的一段代码,在这里只是模拟了下使用场景..
6 F8 P5 C* K6 P; D8 K& X0 n4 e5 C6 A! l
  加入攻击者提交: t7 l( D( m. H. p
+ z( H9 N' m4 V/ m/ ]
  % h, v2 q' ]* i, d6 r+ w$ W8 t
( ^* D; Z/ N% J  ]& E6 `6 H7 \, ]
  在返回的页面就应该显示当前页面的cookie信息。9 E3 E9 ]  r; V+ R# X
7 a! B) m1 E% r" f
  我们可以运用到某些留言板上(提前是没过滤的),然后当管理员审核改条信息时盗取COOKIE信息,并发送到攻击者的空间或者邮箱。。攻击者可以使用cookie修改器进行登陆入侵了。。) i& e- `' z: U; B6 i

6 l9 z/ b0 E& G6 Y( P  当然解决方案也有很多。。下面就介绍一个最常用的方式吧。% Y" [2 H$ Z+ ]* z6 J- `/ ~
3 {& t( P7 i- q$ {
  修复方案1:使用javascript进行转义# }3 l! ^% R8 d7 X3 ^
6 m! T* ?, A" o
  修复方案2:使用php内置函数进行转义% o' L* W4 @4 P

+ s9 r( ?0 c. Z  代码如下:
* v! B9 n1 j8 {" Z! O6 y. V' W2 o3 R- {% W" i
  if(empty($_POST['sub'])){6 S' P0 E# @2 w4 Q

4 M; O7 o9 z8 y8 p0 H7 n- v" p6 \  $str=$_POST['test'];/ K- x1 m6 f( |5 S% i) F; K
4 k1 S5 Q. p9 L5 F& I& p" |
  htmlentities($srt);' j0 U2 i* ~7 t! w& Z

3 k6 n; [5 X0 I, v2 h+ _0 c0 E  echo $srt;% e6 k2 j2 _3 Q9 E! E% M# q5 e9 A* ]
0 s8 Y$ \( H: r: j  ~+ ^4 o7 @5 M4 E
  }
$ Y! P2 u% J* q( d4 \
- W# @/ a' z+ `1 }1 Q  好了,关于SQL注入攻击和XSS攻击的案例与修复方法就讲的差不多了。+ H6 p' ?2 V  R
8 ~" h1 U$ J+ l4 |/ V* C* t
  当然还有其他的解决方法:/ F2 ]5 _, G. B5 r( {

5 S0 O: H) |7 l( S: w! g) C9 z  例如:使用php框架
' c. X& K) P, U9 b" r  \1 C) Q& P( f3 N! _( m- r
  还有其他的一些方法。。' c" p* B) w1 e/ ^4 y$ e% z

9 m5 [- y/ Y+ _. R  当然了,XSS的运用范围与攻击方式很多也很广。  i% v  K, E8 n. ^- I8 e4 J

$ v& V  `5 I/ o, ?  本文只针对php的提交方式进行过滤,还有其他的需要自己去研究
/ Q8 C5 f% D9 ?解决一切网站安全,湖盟云防火墙:hnhack.com
回复

使用道具 举报

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

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-3-13 13:45 , Processed in 0.328265 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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